Как читать файл в режиме реального времени с помощью Python 3 и asyncio, например, tail -f - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу написать программу на Python для Linux, которая читает файл журнала в режиме реального времени по мере его написания, с целью отправки тревоги, если она обнаруживает определенные вещи в журнале.Я хочу, чтобы это использовало asyncio по нескольким причинам - я пытаюсь создать среду, которая делает много вещей одновременно на основе asyncio, и мне нужна практика.

Поскольку я использую asyncio, яочевидно, не нужно использовать блокирующее чтение для ожидания в конце входного файла, чтобы в него было записано больше строк.Я подозреваю, что мне придется в конечном итоге использовать select, но я не уверен.

Я подозреваю, что это довольно просто, но мне трудно найти пример того, как это сделать, илис одним из моих собственных, хотя я немного побаловался в asyncio раньше.Я могу читать и в основном понимать другие примеры асинхронного поиска, которые я нахожу, но по какой-то причине мне трудно написать собственный асинхронный код.

Поэтому я был бы очень признателен, если бы кто-то мог указать мне на пример,Бонусные баллы, если та же техника работает и для чтения со стандартного ввода, а не из файла.

1 Ответ

0 голосов
/ 05 февраля 2019

Я подозреваю, что мне придется использовать select, но я не уверен.Я подозреваю, что это довольно просто, но мне трудно найти пример того, как это сделать

С asyncio идея состоит в том, что вам не нужно select() самостоятельно, потому что asyncioвыбирает для вас - в конце концов, select() или эквивалент находится в центре каждого цикла событий.Asyncio предоставляет абстракции, такие как streams , которые реализуют фасад сопрограммы над моделью асинхронного программирования.Есть также низкоуровневые методы, которые позволяют вам подключиться к select() самостоятельно, но обычно вам следует работать с потоками.

В случае tail -f вы не можетеиспользуйте select(), потому что обычные файлы всегда читаемы.Когда данных нет, вы получаете EOF и должны повторить попытку позже.Вот почему tail -f исторически использовало чтение с паузами с возможностью развертывания API уведомлений, таких как inotify , где доступно.

...