asyncio.create_task/gather/wait/wait_for 区别
请解析asyncio中create_task、gather、wait和wait_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实现流式结果处理