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

