为何asyncio.gather返回结果顺序与任务实际完成顺序不符?
关于asyncio.gather返回结果顺序的疑问
我正在学习Python异步编程,使用asyncio进行测试时遇到疑问。测试代码如下:
import asyncio import random async def worker(name): delay = random.randint(1, 3) await asyncio.sleep(delay) return f"{name} finished after {delay}s" async def main(): tasks = [worker("A"), worker("B"), worker("C")] results = await asyncio.gather(*tasks) print(results) asyncio.run(main())
由于随机延迟,任务实际完成顺序会有所不同,但asyncio.gather始终按任务提交的原始顺序返回结果,例如:
['A finished after 3s', 'B finished after 1s', 'C finished after 2s']
请问这是为什么?
asyncio.gather 从设计逻辑上就规定了按任务传入的原始顺序返回结果,和任务实际完成的先后无关。
它内部会维护一个和传入任务列表长度、位置完全对应的结果容器。当某个任务完成时,程序会把该任务的结果放到容器中与它初始位置对应的索引上,而不是按完成顺序往容器里追加结果。
比如你传入的任务顺序是[A,B,C],哪怕B先完成、C第二个完成、A最后完成,A的结果依然会被放在返回列表的第一个位置,B在第二个,C在第三个。这种设计的核心目的是帮你省去手动关联任务和结果的步骤,让你可以直接通过结果列表的索引对应到最初提交的任务,逻辑更直观清晰。
内容的提问来源于stack exchange,提问作者Anuj Mishra
相关产品推荐
相关产品推荐

