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

asyncio.gather如何合并两组as_completed结果得到[0,0,1,1,2,2]的期望输出

问题原因与调整方案

原代码不符合预期的原因

  • asyncio.as_completed() 会返回一个迭代器,按任务完成顺序逐个产出可等待对象。你在代码中先对result1调用as_completed,解包给asyncio.gather时会先等待result1的所有任务全部按完成顺序返回结果,之后才会处理result2的任务,因此最终结果是先输出第一组的完成顺序结果[0,1,2],再输出第二组的完成顺序结果[0,1,2],拼接后就是你实际得到的输出。
  • 另外as_completed本身就是用来迭代获取已完成任务结果的,不需要搭配gather使用。

调整方法

想要全局合并两组任务的完成顺序结果,只需要把两个任务列表合并后统一传入as_completed迭代即可,调整后代码如下:

import asyncio

async def sleep(i):
    await asyncio.sleep(i)
    return i

async def main():
    result1 = [sleep(i) for i in [2, 1, 0]]
    result2 = [sleep(i) for i in [2, 1, 0]]
    # 合并两组任务统一处理
    all_tasks = result1 + result2
    result = []
    for completed in asyncio.as_completed(all_tasks):
        res = await completed
        result.append(res)
    print(result)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

运行后输出为[0, 0, 1, 1, 2, 2],符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:45:03