2016-04-15 49 views
1

我在(龍捲風)網絡服務器上運行一個耗時較長的CPU密集型任務。我不想將這個任務卸載到一個線程(現在)。我如何在這個長時間運行的任務中正確地「控制」控制權給事件響應,以便Web請求仍然在服務中(注意:我在協作調度的意義上使用「yield」,而不是生成器意義上的,或python關鍵字yield)。asyncio中的合作收益

我的建議是做一個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

它不會在文檔中提到,但目前asyncio.sleep(0)是做這種常見的方式。你可以閱讀完整的討論here。另外asyncio.sleep(0)專門做optimized做工作。由於這種情況has test,我想你可能不會害怕行爲。

+0

完美!鏈接到我正在尋找的確切討論。只要BDFL說這是做到這一點的方法,我很高興:)。 – Claude