使用 loop.create_task 创建的 asyncio Event Loop 任务是否为 FIFO

Are asyncio's EventLoop tasks created with loop.create_task a FIFO

我找不到任何关于此的文档,但根据经验,似乎确实如此。

下面三个例子中协程1和2运行的顺序是什么,这个顺序总是有保证的吗?

一个

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

B

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

C

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

等等

在您的第一个示例中,coro1 将 运行 直到完成。然后 coro2 将 运行。这本质上与它们都是同步函数一样。

在您的第二个示例中,coro1 将 运行 直到它被告知等待。届时,控制权将交给 coro2coro2 将 运行 直到它被告知等待。那时循环将检查 coro1 是否准备好恢复。这将重复,直到两者都完成,然后循环将等待。

在您的最后一个示例中,coro2 首先开始,按照与上一个示例相同的来回操作,然后该过程将在 coro2 完成后停止。然后 coro1 将恢复直到完成,然后循环将等待。

第四个例子是

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

它的行为与第二个示例类似,只是它会在两个都完成后停止。