【发布时间】:2015-11-20 10:30:03
【问题描述】:
我希望在写入多个日志文件时读取它们并使用 asyncio 处理它们的输入。代码必须在 Windows 上运行。根据我对 stackoverflow 和网络搜索的了解,异步文件 I/O 在大多数操作系统上都很棘手(例如,select 将无法按预期工作)。虽然我确信我可以使用其他方法(例如线程)来做到这一点,但我会尝试使用 asyncio 来看看它是什么样的。最有用的答案可能是描述该问题的解决方案的“架构”应该是什么样的,即应该如何调用或调度不同的函数和协程。
下面给了我一个生成器,它逐行读取文件(通过轮询,这是可以接受的):
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 管理相当多的状态的情况下是这样)。
关于我应该如何构建这种代码的任何想法?
【问题讨论】:
-
我已经测试了代码的最顶层版本,它能够读取文件的更改。
标签: python python-asyncio