asyncio 中的合作收益

Cla*_*ude 8 python-3.x python-asyncio python-3.5

我正在(龙卷风)网络服务器上运行一个长时间的 CPU 密集型任务。我不想将此任务卸载到线程(目前)。在这个长时间运行的任务中,如何正确地“yield”控制事件循环,以便网络请求仍然得到服务(注意:我在这里以合作调度的方式使用“yield”,而不是在生成器的意义上使用“yield”) ,或 python 关键字yield)。

我的建议是做一个await asyncio.sleep(0),但是是否可以保证这不只是作为 NOP 实现?我一直在 asyncio 库中寻找专用函数来执行此操作,但到目前为止尚未找到。

示例(python 3.5 async/await 风格):

async def long_task():
    for i in range(LARGE_NUMBER):
        do_something(i)
        if i % 100 == 0:
            await asyncio.sleep(0)
Run Code Online (Sandbox Code Playgroud)

Mik*_*mov 9

它在文档中没有提到,但目前asyncio.sleep(0)是执行此操作的常用方法。您可以在此处阅读完整的讨论。而且还asyncio.sleep(0)专门针对工作进行了优化。既然这个案例有测试,我想你可能不会害怕行为。