asyncio 等到子任务完成

asyncio wait until complete task children

在 asyncio 中,我想编写代码来创建一个名为 something 的任务,即 something;创建其他新任务。 something创建的任务完成后,我要打印complete all tasks

我想要的输出:

start tasks
# before and after ...
complete all tasks

代码:

async def st(n):
    print('before ', n)
    await asyncio.sleep(3)
    print('after ', n)

async def tt(n):
    for i in range(n):
        asyncio.create_task(st(n))

async def main():
    print('start tasks ...')
    loop = asyncio.create_task(tt(3),name='something')
    await loop
    print('complete all tasks')


asyncio.run(main())

如果您想等待asyncio 中发生某事,这通常是您需要使用await 命令的线索。调用 asyncio.create_task 实际上不会导致任务 运行;任务仅 运行 当另一个任务通过调用 await.

放弃控制时

假设您希望 st() 任务同时 运行,这样的事情会起作用:

import asyncio


async def st(n):
    print("before ", n)
    await asyncio.sleep(3)
    print("after ", n)


async def tt(n):
    tasks = []
    for i in range(n):
        tasks.append(st(i))

    await asyncio.gather(*tasks)


async def main():
    print("start tasks ...")
    await tt(3)
    print("complete all tasks")


asyncio.run(main())

tt()中,我们将每个新协程附加到tasks列表中,然后使用asyncio.gather并发执行任务。

你会注意到我们从来不需要在这里调用 asyncio.create_taskasyncio.gather 会为我们小心执行事情,而在 main 中我们只是 运行宁一个协程,所以我们可以 await 直接在上面。

运行 上面的代码导致输出如下:

start tasks ...
before  0
before  1
before  2
after  0
after  1
after  2
complete all tasks