asyncio中的合作产量

时间:2016-04-15 12:57:53

标签: python-3.x python-3.5 python-asyncio

我正在(龙卷风)网络服务器上运行一项耗时长的CPU任务。我不想将此任务卸载到一个线程(现在)。如何在这个长时间运行的任务中正确地“控制”对eventloop的控制,以便仍然提供Web请求(注意:我在协同调度意义上使用“yield”,而不是在生成器意义上,或python关键字yield)。

我的建议是做一个await asyncio.sleep(0),但有保证这不仅仅是作为NOP实现的吗?我一直在寻找asyncio库中的专用函数来做到这一点,但到目前为止一直无法找到。

示例(python 3.5异步/等待样式):

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

1 个答案:

答案 0 :(得分:1)

在doc中没有提及,但目前asyncio.sleep(0)是执行此操作的常用方法。您可以阅读完整的讨论here。此外asyncio.sleep(0)特别optimized来做工作。从这个案例has test开始,我认为你可能不会害怕行为。