展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > 如何使用Python asyncio.wait处理部分任务成功的情况?

如何使用Python asyncio.wait处理部分任务成功的情况?

异步等待返回的已完成任务集合包含成功和异常,需先通过异常检查再调用结果获取,防未处理异常。超时为零时立即返回已结束任务;设为首个完成则等待首任务完成后返回。务必先确认异常为空再取结果。

本文目录

    先说一个非常常见的场景:当你同时扔出多个协程任务时,可能只想拿那些已经完成的结果,而不是傻等所有任务跑完。这时候,asyncio.wait 就是顺手的工具之一。但很多人刚上手时会发现,它返回的“已完成任务”集合里,其实混杂着成功与异常两种情况。这到底是怎么回事?怎么安全地把成功结果取出来?这些问题值得好好捋一捋。

    一、asyncio.wait 什么时候会返回部分完成的任务?

    当你传入一组协程任务时,如果有的已经结束(无论是正常返回还是抛了异常),有的还在运行中,asyncio.wait 会立即把完成和未完成的Task分两组返回给你。它只关心“结束”这个状态,不额外区分是成功还是失败——哪怕某个任务翻了车,它也会出现在 done 集合里。

    所以,区分“哪些是成功的”这一步得自己来。方法是遍历 done 集合,用 task.exception() 检查有没有异常捕获,如果返回 None,说明任务正常完成,这时候再用 task.result() 取值才安全。下面是几个关键点:

    • 不要直接对着 done 里的 task 调 result(),万一任务失败了,会直接抛出未处理的异常。
    • asyncio.wait 默认的行为是 return_when=asyncio.FIRST_COMPLETED,如果你想等待第一批完成的任务再返回,这个选项是对的;如果需要等待出现第一个异常就返回,用 FIRST_EXCEPTION;如果想等到全部结束,用 ALL_COMPLETED,但要小心它会阻塞直到所有任务完成。
    • 很多人会误以为 wait(..., timeout=1) 能做到“超时后只返回成功的任务”,其实不是的。超时后,未完成的任务仍然留在 pending 里,done 里只会包含那些确实已经结束的任务——失败的也包括在内。

    二、如何安全提取已完成且成功的任务结果?

    核心思路很简单:把“已完成”和“成功”两个条件分开判断。先过滤出 done 里没有异常的任务,再统一取结果:

    done, pending = await asyncio.wait(tasks, timeout=2)
    successful_results = []
    for task in done:
        if task.exception() is None:
            successful_results.append(task.result())
    

    这段代码的执行是稳健的,不会因为某个任务异常而中断,也不会试图从失败的任务中拿 result()。如果你需要记录失败原因用于后续重试或分析,可以额外收集 task.exception()。

    再补充几个容易被忽略的细节:

    • 不要用 task.cancelled() 来替代异常检查。取消和异常是两回事,当 cancelled() 返回 True 时,exception() 可能返回 CancelledError。
    • 如果任务在正常逻辑中返回 None 是合法结果,千万不要靠 if task.result() 来判断是否成功——必须用 exception() 是否为 None 来判定。
    • 多个任务可能同时完成,done 是一个 set,所以顺序是不保证的。如果需要按原始任务列表的顺序整理结果,记得提前给 task 加索引,或者在用 asyncio.create_task 包装时绑定上下文信息。

    三、timeout=0 和 return_when=FIRST_COMPLETED 的实际效果差异

    timeout=0 并不是“不等待”,而是“最多等0秒”。它会立刻返回当前已经结束的任务,一个都没有的话,done 就是空集。而 return_when=FIRST_COMPLETED 则会至少等第一个任务结束才返回。

    实际中这两者经常配合使用。比如你想“先看一眼有没有现成结果,没有的话才等着第一个完成”,那就先调 wait(..., timeout=0),如果 done 为空,再调 wait(..., return_when=FIRST_COMPLETED)。

    • timeout=0 在事件循环刚启动时返回空 done 是预期行为,不是bug。
    • 如果所有任务都还没调度执行——比如都是同步阻塞操作,没有套 asyncio.to_thread——那么 done 会长期为空,这时需要配合重试或 fallback 逻辑。
    • return_when 的其他选项(如 ALL_COMPLETED 或 FIRST_EXCEPTION)会改变阻塞行为,选错了会导致程序卡住或过早退出,使用时务必想清楚自己的实际需求。

    四、为什么有时 done 里有 task 却取不到 result?

    最常见的原因:任务已经被取消或异常结束了,但你跳过了 exception() 检查。举个例子:

    task = asyncio.create_task(some_coro())
    await asyncio.sleep(0.1)
    task.cancel()
    done, _ = await asyncio.wait([task])
    # 此时 task in done 为 True,但 task.result() 会 raise CancelledError
    

    另一个容易忽略的情况是:task 可能在 wait 返回前已经正常结束了,但你没来得及处理,后来又手动 cancel() 了它——这时候 exception() 返回的是 CancelledError,而不是原始的异常信息。

    所以一个不得不说的习惯是:永远先确认 task.done(),再调 task.exception() 或 task.result(),这样可以避免 InvalidStateError。另外,如果你用 asyncio.ensure_future 创建任务,行为是一致的;但如果用 loop.create_task,要注意 loop 是否已经关闭。最后,在 finally 块里清理 pending 任务时,别忘了用 cancel() 加上 await asyncio.wait(...) 等它们真正结束,否则可能残留未处理的异常。

    总结下来,实际使用中最关键的并不是“等多少个”或“超时多久”,而是每一次从 done 中取 task 后,必须做三个动作:先确认 done(),再检查 exception(),最后才取 result()。漏掉中间任何一环,都可能让看似稳妥的“部分成功”逻辑突然崩在异常上。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。