Python 异步等待任务集合的完整用法与参数配置

Felix
Felix
发布时间:2026-10-12| 3人浏览过
原创

本文详细讲解 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 异步编程与协程调度的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。