Python多进程中能否用mp.Event作触发器 还是需用Queue传递布尔值
方案可行性结论
你当前的代码存在多处用法错误,调整后完全可以用mp.Event实现触发器需求,不需要强制使用Queue传递布尔值。
现有代码的核心问题
- 主进程初始化错误:你给p02指定的
target是P01_Initializer,实际应该传入P02_Initializer,会导致两个子进程都运行P01的逻辑。 - Event状态判断错误:不能直接用
self.sw_event == False判断状态,必须调用is_set()方法才能获取Event的当前触发状态。 - Event状态重置方法错误:
set()的作用是将Event状态设为True,要重置为False等待下一次触发,需要调用clear()方法。你当前在子进程2里还调用set(),会导致Event状态永远为True,后续再也无法识别新的触发信号。 - 轮询效率极低:子进程2用死循环不停判断Event状态,会占满单核心CPU资源,应该用
wait()方法阻塞等待触发,无触发时进程会休眠不占用CPU资源。
修正后的Event实现逻辑
P01 核心逻辑
def run(self): while True: if condition: # 你的触发判断条件 self.sw_event.set()
P02 核心逻辑
def run(self): while True: # 阻塞等待事件触发,可传入timeout参数设置最长等待时间 self.sw_event.wait() # 触发后先重置事件,避免漏掉下一次触发 self.sw_event.clear() # 执行对应操作 do_something()
Event与Queue方案的适用场景
- 如果只是简单的触发通知,不需要传递额外参数,且触发频率不高于P02的处理速度,用
mp.Event足够,实现更轻量。 - 如果触发时需要传递额外参数、处理多种类型的触发信号,或者触发频率高、怕丢失触发事件,用
Queue更灵活稳妥,队列会按顺序存储所有触发消息不会丢失。
内容的提问来源于stack exchange,提问作者Carlo
相关产品推荐
相关产品推荐

