异步任务中的执行顺序

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.