使用asyncio.gather实现Python异步字典推导遇RuntimeError求助
用asyncio.gather()实现异步字典推导的正确方式
问题原因
你代码报错的核心是未等待asyncio.gather()返回的Future对象完成,直接将其当作可迭代对象进行字典推导。asyncio.gather()返回的是一个Future实例,必须通过await获取其最终执行结果(所有协程返回值组成的列表),才能遍历生成字典。
修正后的代码
import asyncio async def div7_tuple(x): return x, x/7 async def main(): lost = [4, 8, 15, 16, 23, 42] # 先await获取gather的执行结果列表 results = await asyncio.gather(*[div7_tuple(x) for x in lost]) # 用结果列表生成目标字典 print({k: v for k, v in results}) if __name__ == '__main__': asyncio.run(main())
关键说明
asyncio.gather(*[div7_tuple(x) for x in lost])会把所有协程打包成一个Future对象,调用await后会等待所有协程并行执行完成,返回一个包含每个协程返回值的列表。- 你之前的逐个
await写法(main2)是串行执行协程,而用gather能实现并行,效率更高,这也是使用gather的核心优势。 - 运行修正后的代码会输出正确的字典:
{4: 0.5714285714285714, 8: 1.1428571428571428, 15: 2.142857142857143, 16: 2.2857142857142856, 23: 3.2857142857142856, 42: 6.0}
内容的提问来源于stack exchange,提问作者Labu
相关产品推荐
相关产品推荐

