2016-10-18 77 views
1

我找不到任何有關這方面的文檔,但實際上它似乎是它是。asyncio的EventLoop任務是用loop.create_task創建的一個FIFO

以下三個示例中的協程1和2以何種順序運行,並且總是保證順序?

loop.run_until_complete(coro1) 
loop.run_until_complete(coro2) 
loop.run_forever() 

loop.create_task(coro1) 
loop.create_task(coro2) 
loop.run_forever() 

Ç

loop.create_task(coro1) 
loop.run_until_complete(coro2) 
loop.run_forever() 

+1

你的問題太廣泛了。簡短的回答是:不,它們不完全相同。等待協程完成並不等於開始一個新的異步任務。 –

+0

@AndrewSvetlov好的。將改爲更清楚 – Kimvais

回答

1

在您的第一個示例中,coro1將運行,直到它完成。然後coro2將運行。這與它們都是同步函數基本相同。

在你的第二個例子中,coro1將運行,直到它被告知等待。在這一點上,控制權產生到coro2coro2將運行,直到它被告知等待。此時,循環將檢查coro1是否準備好恢復。這將重複,直到兩個都完成,然後循環將等待。

在您的最後一個示例中,coro2首先從前面的示例開始,然後在完成coro2後停止。然後coro1將恢復,直到完成,然後循環將等待。

第四個例子是

loop.run_until_complete(
    asyncio.gather(
     asyncio.ensure_future(coro1), 
     asyncio.ensure_future(coro2), 
    ) 
) 

它會像第二個例子中,除了它會停止,一旦兩者都是完整的。

相關問題