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_task
:asyncio.gather
会为我们小心执行事情,而在 main
中我们只是 运行宁一个协程,所以我们可以 await
直接在上面。
运行 上面的代码导致输出如下:
start tasks ...
before 0
before 1
before 2
after 0
after 1
after 2
complete all tasks
在 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_task
:asyncio.gather
会为我们小心执行事情,而在 main
中我们只是 运行宁一个协程,所以我们可以 await
直接在上面。
运行 上面的代码导致输出如下:
start tasks ...
before 0
before 1
before 2
after 0
after 1
after 2
complete all tasks