如何让Python multiprocessing.Pool中的任务等待唤醒事件
用multiprocessing.Event实现进程池任务的唤醒机制
核心选择:multiprocessing.Event
直接用multiprocessing.Event就够了——它是专门为跨进程同步设计的,支持阻塞等待、全局触发和状态重置,完美匹配你要让所有池内进程等待统一信号的需求。
实现步骤与代码示例
- 初始化一个跨进程的Event对象,确保所有子进程能共享它
- 池内任务写循环逻辑:等待事件触发→执行任务→重置事件→再次等待
- 外部任务通过调用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
相关产品推荐
相关产品推荐

