2016-10-18 75 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), 
    ) 
) 

它会像第二个例子中,除了它会停止,一旦两者都是完整的。

相关问题