Asyncio按API请求限制分组执行任务时sleep等待不生效问题
问题排查与修复方案
问题根因
asyncio.gather()未添加await关键字:程序不会等待当前批次的异步任务执行完成,就会直接执行后续的休眠逻辑,任务执行和休眠的时序完全不符合预期。- 误用同步休眠方法:
time.sleep()是同步阻塞方法,在异步运行环境中会卡住整个事件循环,既无法让出CPU给异步任务执行,也不能实现任务执行完成后再等待间隔的需求,需替换为异步休眠方法asyncio.sleep()。 - 批次切片逻辑错误:
i + 1 * 50受运算符优先级影响,实际计算结果为i + 50,并非你预期的(i+1)*50,同时末尾批次的切片规则错误,会导致最后一批任务丢失元素。
修复后代码
import asyncio nb_tasks = len(tasks) nb_page = (nb_tasks // 50) + 1 for i in range(nb_page): # 修正切片逻辑,自动适配最后不足50的批次 start = i * 50 end = start + 50 tasks_to_play = tasks[start:end] if not tasks_to_play: break print("TIME : " + str(config.time_to_reset)) # 等待当前批次所有异步任务执行完成 await asyncio.gather(*tasks_to_play) # 异步等待指定间隔,不阻塞事件循环 await asyncio.sleep(config.time_to_reset)
注意:上述代码需要放在用
async def定义的异步函数中运行,如果是入口逻辑可以用asyncio.run(你的异步函数())触发执行。
内容的提问来源于stack exchange,提问作者JasonBeni
相关产品推荐
相关产品推荐

