如何在Python中暂停所有asyncio任务并完成修复后恢复?
实现asyncio任务暂停与恢复的方案
核心思路
- 用
asyncio.Event做任务启停的控制开关:事件触发时worker正常运行,事件未触发时worker阻塞等待。 - 在
my_print里检测到k=122时,切换事件为未触发状态,启动repair流程。 - 等repair执行到k=155后,重新触发事件,让所有worker恢复运行。
完整代码示例
import asyncio # 全局控制事件,初始设为触发状态(允许任务运行) pause_event = asyncio.Event() pause_event.set() async def my_print(k): global pause_event print(f"当前k值: {k}") if k == 122: print("检测到k=122,暂停所有worker任务") # 切换事件状态,让worker阻塞 pause_event.clear() # 执行repair直到k达到155 await repair() print("repair完成,恢复所有worker任务") # 恢复事件状态,worker继续运行 pause_event.set() async def repair(): current_k = 122 while current_k < 155: current_k += 1 print(f"repair中,当前k值: {current_k}") # 模拟repair的耗时操作 await asyncio.sleep(0.1) async def worker1(): k = 0 while True: # 先检查事件状态,未触发就阻塞 await pause_event.wait() await my_print(k) k += 1 await asyncio.sleep(0.05) async def worker2(): k = 100 while True: await pause_event.wait() await my_print(k) k += 1 await asyncio.sleep(0.05) async def main(): # 启动两个worker任务 task1 = asyncio.create_task(worker1()) task2 = asyncio.create_task(worker2()) await asyncio.gather(task1, task2) if __name__ == "__main__": try: asyncio.run(main()) except KeyboardInterrupt: print("程序终止")
关键细节说明
pause_event:全局事件对象,set()表示允许运行,clear()表示强制暂停。worker每次循环都会先await pause_event.wait(),确保只有事件触发时才会继续执行。- repair流程:模拟修复操作,循环递增k直到155,期间用
sleep模拟实际耗时。 - 暂停时机:如果worker里有不可中断的长耗时逻辑,需要在逻辑间隙插入
await pause_event.wait(),才能让暂停指令生效。
内容的提问来源于stack exchange,提问作者dmitry123321
相关产品推荐
相关产品推荐

