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

如何让Python multiprocessing.Pool中的任务等待唤醒事件

用multiprocessing.Event实现进程池任务的唤醒机制

核心选择:multiprocessing.Event

直接用multiprocessing.Event就够了——它是专门为跨进程同步设计的,支持阻塞等待、全局触发和状态重置,完美匹配你要让所有池内进程等待统一信号的需求。

实现步骤与代码示例

  1. 初始化一个跨进程的Event对象,确保所有子进程能共享它
  2. 池内任务写循环逻辑:等待事件触发→执行任务→重置事件→再次等待
  3. 外部任务通过调用Event的set()方法触发所有等待的进程
import multiprocessing
import time

def worker(trigger_event, worker_id):
    while True:
        # 阻塞等待事件触发
        trigger_event.wait()
        print(f"Worker {worker_id} 启动任务处理")
        # 模拟实际任务逻辑
        time.sleep(1)
        print(f"Worker {worker_id} 完成本次任务")
        # 重置事件,让进程回到等待状态
        trigger_event.clear()

if __name__ == "__main__":
    # 创建跨进程共享的Event对象
    task_trigger = multiprocessing.Event()

    # 初始化进程池,传入Event给每个worker
    with multiprocessing.Pool(processes=3) as pool:
        # 启动3个常驻worker
        for worker_num in range(3):
            pool.apply_async(worker, args=(task_trigger, worker_num))
        
        # 模拟外部任务触发信号
        for round in range(2):
            print(f"\n第{round+1}轮任务开始,触发所有worker")
            task_trigger.set()
            # 等待所有worker完成本轮任务
            time.sleep(2)
        
        # 终止进程池(实际场景可添加退出信号优雅停止)
        pool.terminate()
        pool.join()

关键细节说明

  • 必须用multiprocessing.Event,不能用threading.Event——后者只适用于线程间同步,跨进程不共享状态
  • trigger_event.set()会一次性唤醒所有处于wait()状态的进程
  • trigger_event.clear()将事件重置为未触发状态,让worker下次调用wait()时继续阻塞
  • 如果需要优雅退出worker,可以额外加一个exit_event,在循环里判断exit_event.is_set()来终止循环

内容的提问来源于stack exchange,提问作者Jay Mosk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:56:13