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

多进程共享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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:21:10