我正在编写代码,我有一个长时间运行的shell命令,其输出发送到磁盘。此命令将为每个文件生成数百GB。我已经成功编写了异步调用此命令的代码,并成功完成控制(等待),以便完成。
我还有一些代码可以在写入文件时异步读取该文件,以便我可以处理其中包含的数据。我遇到的问题是,一旦shell命令完成,我找不到停止文件阅读器的方法。
我想我正在寻找某种中断,一旦shell命令结束,我可以将其传递给我的编写器函数,我可以用它来告诉它关闭文件并结束事件循环。
这是我的作家功能。现在,它会永远运行,等待将新数据写入文件。
import asyncio
PERIOD = 0.5
async def readline(f):
while True:
data = f.readline()
if data:
return data
await asyncio.sleep(PERIOD)
async def read_zmap_file():
with open('/data/largefile.json'
, mode = 'r+t'
, encoding = 'utf-8'
) as f:
i = 0
while True:
line = await readline(f)
print('{:>10}: {!s}'.format(str(i), line.strip()))
i += 1
loop = asyncio.get_event_loop()
loop.run_until_complete(read_zmap_file())
loop.close()
如果我的方法关闭,请告诉我。我对异步编程比较陌生。任何帮助将不胜感激。
答案 0 :(得分:0)
所以,我会做类似
的事情reader = loop.create_task(read_zmap_file)
然后在shell进程退出后管理shell进程的代码中,您可以执行
reader.cancel()
你可以做到
loop.run_until_complete(reader)
或者,您可以在某处设置标志并在while语句中使用该标志。当更简单的工作时,您不需要使用asyncio原语。
那就是说,我会研究一下读者可以避免周期性睡眠的方法。如果您的读者能够跟上shell命令,我建议使用管道,因为管道可以与select一起使用(因此添加到事件循环中)。然后在您的阅读器中,如果需要永久日志,则可以写入文件。我意识到避免周期性睡眠的讨论超出了这个问题的范围,我不想详细介绍,但是你要求提供关于如何最好地处理异步编程的提示。