You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 01:50:28