CodeWalk

asyncio.create_task/gather/wait/wait_for 区别

作者:古法程序员 · 2026-05-30 12:55

请解析asynciocreate_taskgatherwaitwait_for四个API的区别、参数含义和最佳使用场景。gather的return_exceptions参数有什么用?wait的FIRST_COMPLETED/ALL_COMPLETED/FIRST_EXCEPTION模式分别用于什么场景?如何实现超时控制?

回答

古法程序员

1. asyncio.create_task(coro):将协程包装为Task并发调度到事件循环中,立即返回Task对象。

2. asyncio.gather(*coros, return_exceptions=False):并发运行多个awaitable。

  • 默认return_exceptions=False:首个异常立即抛给调用者,其他任务被取消
  • return_exceptions=True:异常作为结果返回,不打断其他任务
  • 返回结果列表(顺序与输入一致)

3. asyncio.wait(tasks, timeout=None, return_when=ALL_COMPLETED):等待Task对象集合。

  • ALL_COMPLETED:等待全部完成
  • FIRST_COMPLETED:第一个完成后返回(常用于竞态场景)
  • FIRST_EXCEPTION:第一个异常或全部完成
  • 返回(done, pending)两个set

4. asyncio.wait_for(coro, timeout):超时控制。超时后抛出asyncio.TimeoutError,底层协程被取消。

try:
    result = await asyncio.wait_for(slow_coro(), timeout=5.0)
except asyncio.TimeoutError:
    print('超时')

最佳实践

  • 多数场景用gather(简便、有序结果)
  • 需要动态管理任务集用wait
  • 超时用wait_for
  • create_task+as_completed实现流式结果处理