异步中的合作收益

Cooperative yield in asyncio

我 运行 在(龙卷风)网络服务器上执行一项长期 CPU 密集型任务。我不想将此任务卸载到线程(暂时)。我如何在事件循环的这个长 运行 任务期间正确 "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)

它没有在文档中提及,但目前 asyncio.sleep(0) 是执行此操作的常用方法。你可以阅读完整的讨论here. Moreover asyncio.sleep(0) was specially optimized to do job. Since this case has test,我想你可能不害怕行为。