我在用python asyncio测试一些基本的构造。我遇到了以下情况:
片段1
import asyncio
async def A():
await asyncio.sleep(10)
print("A...")
async def B():
await asyncio.sleep(15)
print("B...")
async def main():
t = asyncio.create_task(A())
n = asyncio.create_task(B())
await n
print("CCDD...")
await t
asyncio.run(main())
片段2
import asyncio
async def A():
await asyncio.sleep(10)
print("A...")
async def B():
await asyncio.sleep(15)
print("B...")
async def main():
t = asyncio.create_task(A())
n = asyncio.create_task(B())
await n
await t
print("CCDD...")
asyncio.run(main())
片段3
import asyncio
async def A():
await asyncio.sleep(10)
print("A...")
async def B():
await asyncio.sleep(15)
print("B...")
async def main():
t = asyncio.create_task(A())
n = asyncio.create_task(B())
print("CCDD...")
await n
await t
asyncio.run(main())
我发现很难理解上面前两个代码段生成的输出是如何相同的,但最后一个代码段生成的输出与前两个不同?
代码段1、2的输出
A...
B...
CCDD...
代码段3的输出
CCDD...
A...
B...
提前谢谢。
1条答案
按热度按时间s5a0g9ez1#
这完全是一个考虑排序的问题。首先,
n/15/B
始终是15秒的任务t/10/A
这是10秒的。对于所有片段,这意味着A
将在B
,因为您几乎同时启动它们。在代码段1中,您启动它们,然后等待15秒的任务,这意味着它们都将在15秒之前完成
main
印刷品CCDD
(在此之后等待10秒的任务,但任务已经完成)。所以你看A B CCDD
.在代码段2中,您需要等待15秒和10秒的任务完成,然后才能完成
main
印刷品CCDD
,导致A B CCDD
.在代码段3中,启动两个任务,然后立即打印
CCDD
在等待他们俩之前。这给你CCDD A B
.