Skip to content

Python: трюки с генераторами Часть 5 Обработка бесконечных данных

Dmitry Ponyatov edited this page Oct 4, 2019 · 5 revisions

Python: трюки с генераторами

Часть 5 Обработка бесконечных данных

Вопрос

  • Вы когда-нибудь использовали 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 и т.д.)
  • Тем не менее, мы можем легко написать шаги обработки, которые работают с бесконечным потоком данных

Python: трюки с генераторами Часть 6 Питание конвейера

Clone this wiki locally