0

0

Python asyncio.wait 的返回结果分析

舞夢輝影

舞夢輝影

发布时间:2026-02-19 14:16:03

|

596人浏览过

|

来源于php中文网

原创

asyncio.wait 返回两个无序set而非列表,直接索引会报错;timeout仅控制等待时长而不终止任务;return_when决定返回时机但总返回完整(done, pending);done中对象需await才能获取结果。

python asyncio.wait 的返回结果分析

asyncio.wait 返回的是两个集合,不是列表

很多人拿到 asyncio.wait 的返回值后直接用索引取元素(比如 done[0]),结果报 TypeError: 'set' object is not subscriptable。这是因为它的返回值是两个 set:一个装已完成的 TaskFuture,另一个装还在跑的。

常见错误场景:想等几个协程完成,然后按顺序处理结果,却误以为返回值是有序列表。

  • asyncio.wait 不保证完成顺序,也不保留原始传入顺序
  • 返回的 donepending 都是 set,无序、去重、不支持下标访问
  • 如果需要顺序或结果映射,得自己用 asyncio.gather 或显式维护 task → result 关系

timeout 参数不等于“最多等多久”,而是“超时后立即返回”

设了 timeout=5,不代表所有任务都会被取消或中断;它只是让 wait 在 5 秒后不再阻塞,把当时还没完成的任务放进 pending 集合里,而已运行的任务继续执行——除非你手动取消它们。

典型踩坑:以为加了 timeout 就能防卡死,结果 pending 里的 task 还在后台跑,甚至引发资源泄漏。

立即学习Python免费学习笔记(深入)”;

超会AI
超会AI

AI驱动的爆款内容制造机

下载
  • timeout 只影响 wait 函数本身的阻塞行为,不影响 task 生命周期
  • 真正要中断任务,得配合 asyncio.create_task(...).cancel() 或用 asyncio.wait_for
  • 若需“超时即终止”,优先考虑 asyncio.wait_for,而不是靠 wait + 手动 cancel

return_when 控制的是“什么时候返回”,不是“返回哪些”

return_when 的三个可选值:asyncio.FIRST_COMPLETEDasyncio.FIRST_EXCEPTIONasyncio.ALL_COMPLETED,决定的是函数何时从等待中退出,但每次返回的都是完整的 (done, pending) 二元组。

容易混淆的点:以为设成 FIRST_COMPLETED 就只返回一个 done,其实 done 里可能有多个——只要它们恰好在同一轮事件循环中完成(比如多个 task 同时 resolve)。

  • FIRST_EXCEPTION 不会跳过正常完成的 task,只要有一个抛异常,就立刻返回,但 done 里仍包含其他已成功结束的 task
  • ALL_COMPLETED 是唯一能确保 pending 为空的情况(前提没 timeout)
  • 别依赖 len(done) == 1 来判断是否首次完成,这是竞态行为

done 集合里的对象必须 await 才能得到结果

done 里放的是 TaskFuture 对象,不是协程返回值。直接 print 它们只会看到 <task finished name="..." result="..."></task> 这类字符串,而无法安全提取值——尤其当 task 出错时,不 await 就拿不到异常。

真实使用中常漏掉这步,导致后续逻辑拿不到数据或静默失败。

  • 正确做法:遍历 done,对每个 task 调用 task.result()(会抛出异常)或 await task(更自然)
  • 如果 task 已经完成,task.result() 是安全的;但如果还没完成(理论上不该进 done,但并发边界下可能有误判),会报 InvalidStateError
  • 推荐统一用 await task,既清晰又符合 async/await 语义
事情说清了就结束。最麻烦的其实是 done/pending 的类型和生命周期管理——它们不像 gather 那样“自动收尾”,得你自己盯着状态、处理异常、清理 pending。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

12

2026.02.03

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

573

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

216

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1553

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

640

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

945

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

896

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号