python—异步任务中的执行顺序

cnjp1d6j  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(639)

我在用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...

提前谢谢。

s5a0g9ez

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 .

相关问题