如何在Python

时间:2017-04-29 19:28:23

标签: python-3.x python-asyncio

我正在编写代码,我有一个长时间运行的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()

如果我的方法关闭,请告诉我。我对异步编程比较陌生。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

所以,我会做类似

的事情
reader = loop.create_task(read_zmap_file)

然后在shell进程退出后管理shell进程的代码中,您可以执行

reader.cancel()

你可以做到

loop.run_until_complete(reader)

或者,您可以在某处设置标志并在while语句中使用该标志。当更简单的工作时,您不需要使用asyncio原语。

那就是说,我会研究一下读者可以避免周期性睡眠的方法。如果您的读者能够跟上shell命令,我建议使用管道,因为管道可以与select一起使用(因此添加到事件循环中)。然后在您的阅读器中,如果需要永久日志,则可以写入文件。我意识到避免周期性睡眠的讨论超出了这个问题的范围,我不想详细介绍,但是你要求提供关于如何最好地处理异步编程的提示。