Python 3.x 异步生产中的合作产出
我正在(tornado)Web服务器上运行一个长时间的CPU密集型任务。我不想把这个任务转移到一个线程上(现在)。在这个长时间运行的任务中,如何正确地将控制“屈服”到eventloop,以便web请求仍然得到服务(注意:我在这里使用的“屈服”是协作调度意义上的屈服,而不是生成器意义上的屈服,或者python关键字Python 3.x 异步生产中的合作产出,python-3.x,python-3.5,python-asyncio,Python 3.x,Python 3.5,Python Asyncio,我正在(tornado)Web服务器上运行一个长时间的CPU密集型任务。我不想把这个任务转移到一个线程上(现在)。在这个长时间运行的任务中,如何正确地将控制“屈服”到eventloop,以便web请求仍然得到服务(注意:我在这里使用的“屈服”是协作调度意义上的屈服,而不是生成器意义上的屈服,或者python关键字yield) 我的建议是做一个等待asyncio.sleep(0),但是有没有保证这不仅仅是作为NOP实现的?我一直在asyncio库中寻找一个专用函数来实现这一点,但到目前为止还没有找
yield
)
我的建议是做一个等待asyncio.sleep(0)
,但是有没有保证这不仅仅是作为NOP实现的?我一直在asyncio库中寻找一个专用函数来实现这一点,但到目前为止还没有找到
示例(python 3.5异步/等待样式):
文档中没有提到它,但目前,
asyncio.sleep(0)
是实现这一点的常用方法。你可以阅读完整的讨论。而且asyncio.sleep(0)
是专门做这项工作的。既然是这样,我想你可能不会害怕行为。太好了!链接到我想要的确切讨论。只要BDFL说这是解决问题的方法,我很高兴:)。
async def long_task():
for i in range(LARGE_NUMBER):
do_something(i)
if i % 100 == 0:
await asyncio.sleep(0)