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

Python asyncio如何处理不同完成时长的任务 实现结果即时通知

你的理解完全正确。
所有任务确实会在创建后并发执行,但你当前的结果处理逻辑是严格按任务创建顺序逐个await,只要排在列表首位的慢任务未完成,哪怕后续任务早就执行结束,也不会进入结果处理流程,会出现你说的「等待1分钟后才批量输出其余49个任务结果」的问题。

要实现任务完成后即时处理结果,最常用的方案是使用asyncio.as_completed(),该方法接收任务列表作为入参,返回一个迭代器,哪个任务先执行完成,就优先返回该任务的结果,不需要按创建顺序等待。
修改后的示例代码如下:

import asyncio

# 任务创建逻辑和原有逻辑一致
tasks = []
for n in range(1, 50):
    tasks.append(asyncio.create_task(get_html(f"https://example.com/things?id={n}")))

# 结果处理部分改为遍历as_completed返回的迭代器
for task in asyncio.as_completed(tasks):
    html = await task
    thing = get_thing_from_html(html)
    print(f"Thing found: {thing}", flush=True)

如果不需要集中处理结果,也可以给每个任务绑定完成回调,任务执行结束后会自动触发回调函数,示例如下:

import asyncio

# 定义完成后的回调处理逻辑
def handle_result(task):
    html = task.result()
    thing = get_thing_from_html(html)
    print(f"Thing found: {thing}", flush=True)

# 创建任务时绑定回调
tasks = []
for n in range(1, 50):
    task = asyncio.create_task(get_html(f"https://example.com/things?id={n}"))
    task.add_done_callback(handle_result)
    tasks.append(task)

# 等待所有任务执行完成即可
await asyncio.gather(*tasks)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:24:03