You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

asyncio.wait直接传入协程对象运行不符合预期的问题求解

原理说明

  • asyncio.wait 设计上的合法入参是Task对象集合,早期版本支持直接传入协程属于兼容逻辑,现在已经弃用。
  • 当你直接传入协程对象时,asyncio.wait 内部会自动调用asyncio.create_task()将每个协程封装为全新的Task对象,这个隐式生成的Task对象只会在wait内部持有,你外层代码手里的依然是最初的协程对象,二者是完全独立的两个实例。
  • asyncio.wait 执行结束后返回的done、pending集合,存储的元素全部是Task对象:如果入参是你手动创建的Task,就返回你传入的Task实例;如果是你传入的协程隐式转换的,就返回内部生成的新Task实例。
  • 对应到示例代码的逻辑:你判断的是「原始协程对象coro是否在done集合里」,但done里装的是内部隐式生成的Task实例,两个对象的类型、内存地址完全不同,in判断永远返回False,所以那个分支永远不会执行。

正确写法示例

你只需要提前手动将协程封装为Task,持有Task的引用再传入asyncio.wait即可:

import asyncio

async def foo():
    return 42

async def main():
    # 提前手动创建Task,持有引用
    task = asyncio.create_task(foo())
    done, pending = await asyncio.wait({task})

    if task in done:
        # 现在这个分支可以正常执行
        print('yay!')

asyncio.run(main())

内容的提问来源于stack exchange,提问作者joseville

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:45:00