Python 3.x 如何在Python中习惯性地结束异步IO操作

Python 3.x 如何在Python中习惯性地结束异步IO操作,python-3.x,python-asyncio,Python 3.x,Python Asyncio,我正在编写代码,其中有一个长时间运行的shell命令,其输出被发送到磁盘。此命令将为每个文件生成数百GB。我已经成功地编写了异步调用此命令的代码,并成功地生成了控制(等待)以使其完成 我还有一些代码,可以在写入文件时异步读取该文件,以便处理其中包含的数据。我遇到的问题是,一旦shell命令完成,我就找不到停止文件读取器的方法 我想我正在寻找某种中断,一旦shell命令结束,我就可以将它传递到writer函数中,我可以用它来关闭文件并结束事件循环 这是我的writer函数。现在,它会一直运行,等待

我正在编写代码,其中有一个长时间运行的shell命令,其输出被发送到磁盘。此命令将为每个文件生成数百GB。我已经成功地编写了异步调用此命令的代码,并成功地生成了控制(等待)以使其完成

我还有一些代码,可以在写入文件时异步读取该文件,以便处理其中包含的数据。我遇到的问题是,一旦shell命令完成,我就找不到停止文件读取器的方法

我想我正在寻找某种中断,一旦shell命令结束,我就可以将它传递到writer函数中,我可以用它来关闭文件并结束事件循环

这是我的writer函数。现在,它会一直运行,等待新数据写入文件

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()

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

所以,我想

reader = loop.create_task(read_zmap_file)
然后,在shell进程退出后管理shell进程的代码中,可以执行以下操作

reader.cancel()
你能行

loop.run_until_complete(reader)
或者,您可以简单地在某处设置一个标志,并在while语句中使用该标志。当一些更简单的东西工作时,您不需要使用asyncio原语


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

因此,我想

reader = loop.create_task(read_zmap_file)
然后,在shell进程退出后管理shell进程的代码中,可以执行以下操作

reader.cancel()
你能行

loop.run_until_complete(reader)
或者,您可以简单地在某处设置一个标志,并在while语句中使用该标志。当一些更简单的东西工作时,您不需要使用asyncio原语

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

请参阅。请参阅。