如何用asyncio按每10个一组执行任务并等待每组完成?
实现按组异步执行任务
首先修正原代码中任务列表的错误:原代码里my_tasks.append(lambda: my_task)并没有正确创建可执行的任务逻辑,只是保存了一个返回函数的lambda,我们需要直接基于任务参数来分组处理。
完整实现代码
import asyncio async def my_task(x): await asyncio.sleep(0.1) print(f"done: {x}") async def main(): # 按每10个任务为一组,循环处理所有任务 for i in range(0, 1000, 10): # 取出当前组的任务参数范围,处理最后一组可能不足10个的情况 group_args = range(i, min(i + 10, 1000)) # 创建当前组的所有协程任务 group_tasks = [my_task(x) for x in group_args] # 等待当前组所有任务完成后,再执行下一组 await asyncio.gather(*group_tasks) if __name__ == "__main__": asyncio.run(main())
关键逻辑说明
- 分组处理:通过
range(0, 1000, 10)生成每组的起始索引,每次步进10,确保每组最多包含10个任务;用min(i+10, 1000)避免最后一组超出总任务数。 - 并行执行组内任务:针对每组参数生成对应的协程对象,用
asyncio.gather并行执行组内所有任务,保证同一组的任务异步运行。 - 组间串行等待:每次循环都等待当前组的
gather完成后再进入下一轮循环,严格实现“一组完成再执行下一组”的要求。
原代码问题修正
原代码中my_tasks.append(lambda: my_task的写法无效:lambda仅返回my_task函数本身,既没有传入必要的参数x,也没有生成可执行的协程对象。上述实现直接基于任务参数分组,从根源上解决了这个问题。
内容的提问来源于stack exchange,提问作者Koklushkin
相关产品推荐
相关产品推荐

