异步任务中的执行顺序
order of execution in async task
我正在尝试 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...
都是考虑顺序的问题。首先,n/15/B
始终是 15 秒的任务,而 t/10/A
是 10 秒的任务。对于所有片段,这意味着 A
将在 B
之前打印,因为您大致在同一时间开始它们。
在片段 1 中,您同时启动它们然后等待 15 秒的任务,这意味着 两者 将在 main
打印 CCDD
(等待 10 秒之后的任务,但它已经完成)。因此你看到 A B CCDD
.
在片段 2 中,您等待 15 秒和 10 秒的任务完成,然后 main
打印 CCDD
,导致 A B CCDD
.
在片段 3 中,您启动两个任务,然后 立即 打印 CCDD
,然后再等待它们。这给你 CCDD A B
.
我正在尝试 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...
都是考虑顺序的问题。首先,n/15/B
始终是 15 秒的任务,而 t/10/A
是 10 秒的任务。对于所有片段,这意味着 A
将在 B
之前打印,因为您大致在同一时间开始它们。
在片段 1 中,您同时启动它们然后等待 15 秒的任务,这意味着 两者 将在
main
打印CCDD
(等待 10 秒之后的任务,但它已经完成)。因此你看到A B CCDD
.在片段 2 中,您等待 15 秒和 10 秒的任务完成,然后
main
打印CCDD
,导致A B CCDD
.在片段 3 中,您启动两个任务,然后 立即 打印
CCDD
,然后再等待它们。这给你CCDD A B
.