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
相关产品推荐
相关产品推荐

