Python 异步等待任务集合的完整用法与参数配置
本文详细讲解 Python 标准库中 asyncio.wait() 函数的并发等待机制。通过配置 return_when 与 timeout 参数,开发者可按需实现全量完成、首个完成或首个失败等策略,并安全提取 done 与 pending 任务集合,轻松应对批量协程调度与阶段性结果判断场景。
掌握 asyncio.wait() 的并发调度原理
asyncio.wait() 是 Python 标准库中用于协调多个协程执行状态的内置函数。它接收一组可等待对象(通常为 asyncio.Task 实例),阻塞当前协程直到满足预设条件后返回。该函数不会自动启动或取消任务,而是专注于状态监听与分组反馈,非常适合需要批量发起后台请求或计算,并根据部分结果提前干预主流程的场景。
配置等待策略与超时控制
默认情况下,asyncio.wait() 会阻塞直到所有传入任务结束。开发者可通过两个关键参数定制行为:
return_when:指定触发返回的条件,支持asyncio.ALL_COMPLETED(全部完成)、asyncio.FIRST_COMPLETED(首个完成)与asyncio.FIRST_EXCEPTION(首个抛出异常)。设置为后两者时,未满足条件的其余任务将继续并行运行,不会被自动取消。timeout:以秒为单位设定最长等待时间。超时触发时函数正常返回当前已就绪的任务子集,不抛出异常也不中断正在运行的协程。
第1步:创建并收集异步任务
目的:将协程包装为 Task 对象以便统一管理。
入口/动作:使用列表推导式配合 asyncio.create_task() 生成任务队列。
# 定义基础协程
async def task_coro(arg):
value = random.random()
await asyncio.sleep(value)
print(f>task {arg} done with {value}
# 批量创建任务
tasks = [asyncio.create_task(task_coro(i)) for i in range(10)]
第2步:按业务逻辑调用等待函数
目的:根据是否需要快速响应或容错,选择对应的 return_when 模式。
动作/参数:直接 await 函数调用,传入任务集与策略标识。
# 等待第一个任务完成即可继续后续逻辑
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
# 等待第一个任务发生异常时中断
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION)
第3步:解析返回结果并清理资源
目的:确认哪些任务已终结,决定未完成任务的处理方式。
完成状态:函数返回一个包含两个集合的元组 (done, pending)。done 包含满足条件的任务,可直接通过 .result() 获取返回值或通过 .exception() 捕获错误;pending 包含尚未达标的任务。若无需继续执行 pending 中的任务,应手动调用 cancel() 释放系统资源。
完整实战代码与结果核对
以下示例展示如何在一个事件循环内完整跑通任务创建、全量等待与结果输出。运行脚本后,控制台将依次打印各任务的随机耗时与完成标志,最后输出汇总信息。
# SuperFastPython.com
# example of waiting for all tasks to complete
from random import random
import asyncio
async def task_coro(arg):
value = random()
await asyncio.sleep(value)
print(f'>task {arg} done with {value}
async def main():
tasks = [asyncio.create_task(task_coro(i)) for i in range(10)]
done, pending = await asyncio.wait(tasks)
print('All done'
asyncio.run(main())
预期终端输出特征为:多行 >task X done with Y 格式日志(Y 为浮点数),末尾固定显示 All done。由于内部使用了随机休眠,单次运行的先后顺序可能不同,但任务总数与最终输出形态保持一致。若需验证特定条件下的返回集合,可在 await asyncio.wait(...) 下方添加 print(len(done), len(pending)) 进行动态核对。
以上就是 Python 异步等待任务集合的详细内容,更多关于 Python 异步编程与协程调度的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









