-
Notifications
You must be signed in to change notification settings - Fork 5
Python: трюки с генераторами Часть 5 Обработка бесконечных данных
Dmitry Ponyatov edited this page Oct 4, 2019
·
5 revisions
- Вы когда-нибудь использовали
tail -f
в Unix?
% tail -f logfile
...
... lines of output ...
...
- Это печатает строки, записанные в конец файла
- «Стандартный» способ просмотра лог-файла в процессе работы системы
- Я использовал это все время, работая над научным моделированием десять лет назад ...
- Мониторинг файла журнала приводит к "бесконечному" потоку
- Он постоянно просматривает файл и выдает строки, как только записываются новые данные
- Но вы не знаете, сколько данных на самом деле будет записано (неограниченно)
- И файлы журнала часто могут быть огромными
- Python-версия
tail -f
import time
import os
def follow(thefile):
thefile.seek(0, os.SEEK_END) # конец файла
while True:
line = thefile.readline()
if not line:
time.sleep(0.1) # короткий сон
continue
yield line
- Идея: Перемещаться на конец файла и многократно пытаться читать новые строки. Если в файл будут записаны новые данные, мы их заберем.
- Используем нашу следящую функцию:
logfile = open("access-log")
loglines = follow(logfile)
for line in loglines: print(line, end='')
- Это выдает тот же результат, что и
tail -f
- Мы просто подключили эту новую схему ввода к передней части нашего конвейера обработки
- Все остальное все еще работает, с одним предостережением: функции, которые потребляют всю итерацию, не завершаются (
min
,max
,sum
,set
и т.д.) - Тем не менее, мы можем легко написать шаги обработки, которые работают с бесконечным потоком данных