Python多处理中的变量不会改变

我正在尝试在我的多处理代码中使用字典。问题是当我在流程中更改一个键的值时,更改只会影响该流程。显然,进程的变量参数是该变量的副本。我尝试使用 dict 方法,但它也不起作用。我的错误是什么?

import time 
from multiprocessing import Process, Manager     

def f1(list1, set1):
    list1.append(3)
    set1['func']='f1' 
    print('f1 dic',set1) 
    print('f1 list',list1) 
    while True:
        time.sleep(3)
        print('f1 dic',set1) 
        print('f1 list',list1) 

def f2(list1): 
    list1.append(4)
    settings_dic['func']='f2'
    print('f2 dic',settings_dic) 
    print('f2 list',list1) 
    while True:
        time.sleep(3)
        print('f2 dic',settings_dic) 
        print('f2 list',list1) 

if __name__ == '__main__':     
    # list1 = Manager().dict()    
    settings_dic = Manager().dict()  
    Global = Manager().Namespace()
    list1 = [1,2]
    settings_dic = { 
        'mode' : 'master', 
        'logger' : 'True',
        'func' : ''
    }       
    p_video_get = Process(target=f1, args=(list1,settings_dic,))
    p_video_get.daemon = True
    p_video_get.start() 
    p_packetTrasnmission = Process(target=f2, args=(list1,))
    p_packetTrasnmission.daemon = True
    p_packetTrasnmission.start()  
    
    list1.append(5)
    settings_dic['func'] = 'main'
    print('main dic',settings_dic)
    print('main list',list1)  

    while True:
        time.sleep(3)
        print('main dic',settings_dic)
        print('main list',list1)  

回答

更新:

正如 juanpa.arrivillaga 所指出的,上面代码的问题在于,Manager.dict()被重新分配为正常dict意味着它丢失了对 的引用Manager.dict()并且没有改变/传递那个。其余的是我最初的回应,我认为 OP 只是试图传递一本字典。

原来的:

当你启动一个单独的进程时,那个进程有自己的地址空间。除非您进行设置,否则它们不会共享任何内存(以及扩展数据)。每个进程都会获得您传入的参数的副本,并且它们的进程的内存管理它们自己的副本(这是通过酸洗对象并将其发送到新进程来完成的)。一旦复制,它们就不会同步。要让一个进程更改另一个进程中的数据,您有几种选择。

您需要通过共享通信或共享对象设置一些 IPC 。队列是一种将更新发布到数据结构的简单方法,然后其他进程可以弹出并更新他们自己的副本。

或者,如果您使用的是 3.8+,则可以设置共享内存。我还没有这样做,您仍然需要编写代码来监视和解码更改。但这是让一个进程与另一个进程通信的另一种方式。


以上是Python多处理中的变量不会改变的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>