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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 07:42:37