Python中如何await任务列表 实现C# Task.WhenAll等效效果?
Python 实现等价于 C#
Task.WhenAll 功能的方法 Python 标准库asyncio中的asyncio.gather()就是和C# Task.WhenAll逻辑完全对等的方法,支持并发调度所有传入的可等待任务,等待全部任务执行完毕后,按传入顺序返回对应结果的列表。
你当前写的循环await写法存在逻辑问题:
逐次循环
await协程是串行执行逻辑:必须等前一个协程完全执行结束,才会启动下一个协程,没有任何并发效果,和Task.WhenAll并发执行所有任务、统一等待完成的行为完全不符。
基础用法
import asyncio async def main(): coroutines = ... # 你的协程列表 # 并发执行所有协程,等待全部完成 results = await asyncio.gather(*coroutines) # results 为和传入协程顺序一一对应的执行结果列表
补充说明
- 如果你传入
asyncio.gather()的是原生协程对象,方法会自动将其包装为Task对象调度执行,无需手动提前创建任务 - 默认情况下如果某个任务抛出异常,
gather()会立即抛出该异常,其余未完成的任务不会自动取消;如果需要把异常也作为结果统一收集,可以传入参数return_exceptions=True,异常对象会和正常返回值一起放到结果列表里,后续可以统一处理 - Python 3.11+ 版本新增了
asyncio.TaskGroup,用结构化并发的方式实现相同逻辑,异常处理更安全,示例如下:
import asyncio async def main(): coroutines = ... # 你的协程列表 async with asyncio.TaskGroup() as tg: tasks = [tg.create_task(coro) for coro in coroutines] # 退出上下文管理器时会自动等待所有任务执行完成,任意任务抛出异常时会自动取消其余所有任务
内容的提问来源于stack exchange,提问作者Ernest Rutherford
相关产品推荐
相关产品推荐

