Python asyncio能否在等待响应时继续循环并处理完成的任务?
你的需求可以用asyncio实现
当前代码的问题是你一次性把10个任务全部创建完毕,asyncio会快速跑完所有任务的启动逻辑(也就是print(f'going to sleep: {index}'))——这部分是同步执行的,没有await阻塞,所以所有"going to sleep"会先集中输出;等1秒后所有sleep同时结束,再批量输出"waking up"。
要实现你想要的「启动新任务时,若有已完成的sleep优先处理响应」的效果,得逐个启动任务,同时实时监听并处理已完成的任务,用asyncio.as_completed就能做到,修改后的代码如下:
import asyncio async def function(index): print(f'going to sleep: {index}') await asyncio.sleep(1) # Python注释用#,不是// print(f'waking up: {index}') async def main(): tasks = [] # 逐个启动任务,穿插处理已完成的任务 for i in range(10): # 创建并启动单个任务 task = asyncio.create_task(function(i)) tasks.append(task) # 检查是否有已完成的任务,有就优先处理 for done_task in asyncio.as_completed(tasks): await done_task # 处理完一个就跳出循环,继续启动下一个任务 break asyncio.run(main())
运行这段代码时,会先启动若干任务,当第一个任务的sleep完成时,会立即输出它的"waking up",之后再继续启动剩下的任务,完全符合你期望的输出模式。
原理是:asyncio.as_completed会实时监听任务列表,一旦有任务完成就立即返回该任务,await它时会执行sleep之后的逻辑(也就是打印"waking up")。每次启动新任务后先检查并处理已完成的任务,避免一次性启动所有任务,从而实现「启动新任务」和「处理完成任务」的穿插执行。
内容的提问来源于stack exchange,提问作者jrowenw
相关产品推荐
相关产品推荐

