【问题标题】:Why dict not being updated in python multiprocessing?为什么 dict 在 python 多处理中没有被更新?
【发布时间】:2018-04-30 04:26:27
【问题描述】:

请检查以下代码。

我初始化了一个 dict 并将它发送到一个函数 f。我检查了return_dict的地址。它在过程内部没有改变。所以我认为应该更新字典

但是没有更新,为什么呢?

from multiprocessing import Process

return_dict = dict({})
print id(return_dict)


def f(value, return_dict):
    return_dict['value'] = value
    print return_dict


p = Process(target=f, args=(100, return_dict))
p.start()
p.join()
print return_dict

【问题讨论】:

    标签: python python-2.7 multiprocessing


    【解决方案1】:

    您的Process() 创建了另一个进程。当子进程生成时,它会从父进程继承对象,但是对这些对象的修改只会修改子进程内存中的对象,并且这些更改对父进程都不可见。

    你可以通过使用Manager()来克服这个问题:

    from multiprocessing import Process, Manager
    
    def f(value, return_dict):
        return_dict['value'] = value
        print return_dict
    
    d = Manager().dict()    
    p = Process(target=f, args=(100, d))
    p.start()
    p.join()
    print d
    

    【讨论】:

    • 但是return_dict的内存地址没有变化。怎么解释?如果它们是不同的对象,我认为地址不应该相同。如果它们是同一个对象,那么更改应该对父进程可见
    • 我会假设内存地址是相对于进程内存空间的,而不是计算机内存中的绝对地址。如果父进程中的对象位于堆的位置 X,那么当生成子进程时,它将收到此对象的一对一副本。对象地址仍然在 X,即使它是计算机中不同的进程和不同的内存段。您的子进程无论如何都无法访问父进程内存,因为它会导致分段错误。
    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多