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

