Я хочу прочитать несколько файлов журнала, когда они написаны, и обрабатывать их ввод с помощью asyncio. Код должен запускаться в окнах. Из того, что я понимаю из поиска как stackoverflow, так и Интернета, асинхронный ввод-вывод файлов сложен для большинства операционных систем (select
не будет работать, как предполагалось, например). Хотя я уверен, что могу сделать это с помощью других методов (например, потоков), я бы попробовал асинхронно, чтобы понять, что это такое. Наиболее полезным ответом, вероятно, будет тот, который описывает, как должна выглядеть "архитектура" решения этой проблемы, т.е. Как вызывать или планировать различные функции и сопрограммы.
Ниже приведен генератор, который читает файлы по строкам (через опрос, который является приемлемым):
import time
def line_reader(f):
while True:
line = f.readline()
if not line:
time.sleep(POLL_INTERVAL)
continue
process_line(line)
С несколькими файлами для мониторинга и обработки этот тип кода потребует потоков. Я немного изменил его, чтобы использовать его в asyncio:
import asyncio
def line_reader(f):
while True:
line = f.readline()
if not line:
yield from asyncio.sleep(POLL_INTERVAL)
continue
process_line(line)
Этот вид работает, когда я планирую его через цикл событий asyncio, но если process_data
блокирует, то это, конечно, не очень хорошо. Когда я начинал, я думал, что решение будет выглядеть примерно так:
def process_data():
...
while True:
...
line = yield from line_reader()
...
но я не мог понять, как сделать эту работу (по крайней мере, не без process_data
управления довольно немного состояния).
Любые идеи о том, как я должен структурировать такой код?