多进程共享Condition对象触发RuntimeError问题求助
多进程间共享Condition对象的错误原因及解决方法
你尝试用multiprocessing.Queue在两个进程间共享Condition对象实现同步,但触发了RuntimeError: Condition objects should only be shared between processes through inheritance错误,原因和解决方法如下:
原代码
import multiprocessing from multiprocessing import Process, Condition import time def function_1(m_queue=multiprocessing.Queue): time.sleep(60) condition=m_queue.pop() time.sleep(60) condition.notify() print("F1: Done") def function_2(): condition = Condition() multi_queue = multiprocessing.Queue() multi_queue.put(condition) with condition: p1=Process(target=function_1, args=(multi_queue, ), daemon=True) p1.start() condition.wait() print("Finished") if __name__ == "__main__": function_2()
触发的错误
RuntimeError: Condition objects should only be shared between processes through inheritance
错误原因
multiprocessing.Queue传递对象的本质是通过序列化(pickle)将对象拷贝到子进程中,而非共享同一个内存对象。Condition内部依赖与进程绑定的底层锁机制,序列化后的拷贝无法和原进程的Condition保持同步状态——两个进程拿到的是完全独立的Condition实例,根本无法实现预期的通知/等待逻辑。因此Python明确禁止这种共享方式,要求Condition只能通过进程继承的方式共享:也就是在创建子进程前初始化Condition,子进程通过父进程的地址空间直接继承这个对象,而非通过序列化传递拷贝。
正确实现方式
直接在创建子进程前初始化Condition,并将其作为参数传递给子进程(此时子进程继承的是同一个Condition对象):
import multiprocessing from multiprocessing import Process, Condition import time def function_1(condition): time.sleep(2) # 缩短等待时间便于测试 time.sleep(2) with condition: condition.notify() print("F1: Done") def function_2(): condition = Condition() # 创建子进程时直接传入Condition对象 p1 = Process(target=function_1, args=(condition,), daemon=True) p1.start() with condition: condition.wait() print("Finished") if __name__ == "__main__": function_2()
这个实现中,父进程和子进程使用的是同一个Condition实例,底层锁机制能正常工作,notify()和wait()可以正确实现进程间同步。
内容的提问来源于stack exchange,提问作者Tricker Macedonia
相关产品推荐
相关产品推荐

