Python 在进程之间修改共享dict对象不会';行不通

Python 在进程之间修改共享dict对象不会';行不通,python,multiprocessing,Python,Multiprocessing,我想我已经在这里找到了一个类似的问题,但是没有找到一个我能很容易理解的好的解释。我也试图阅读python文档,但也没有找到详细的解释 下面是代码: from multiprocessing import Process, Manager def f(d): d[1] = [[1]] if 2 in d.keys(): d[2].append([2]) else: d[2] = [[2]] d[3] = [[3]] if __nam

我想我已经在这里找到了一个类似的问题,但是没有找到一个我能很容易理解的好的解释。我也试图阅读python文档,但也没有找到详细的解释

下面是代码:

from multiprocessing import Process, Manager

def f(d):
    d[1] = [[1]] 
    if 2 in d.keys():
       d[2].append([2])
    else:
       d[2] = [[2]]
    d[3] = [[3]]

if __name__ == '__main__':

    with Manager() as manager:
        d = manager.dict()

        p1 = Process(target=f, args=(d,))
        p2 = Process(target=f, args=(d,))
        p1.start()
        p2.start
        p1.join()
        p2.join

        print(d)
我有两个进程正在运行并从Manager进程共享一个dict对象。我可以向dict对象添加新的键-值对,但如果键已经存在,则无法修改值


为什么会这样?如果我们想修改这些共享对象,那么使用这些共享对象会出现什么问题

首先,您没有启动第二个进程

p2.start   # <--- no `()`
p2.join    # <--- no `()`
但是,还有一个问题。以下语句涉及对共享对象的多次读、写操作;它不是原子的;所以不能保证上述程序每次都能产生相同的结果

if 2 in d:
   d[2] = d[2] + [[2]]
else:
   d[2] = [[2]]

您需要使用一个锁来确保共享对象只能由一个进程访问。

我举了一个例子来说明原子性问题。(因为我不想延长答案太长,所以没有包括在内)谢谢,它很有效。但之前我也尝试过(不知道原因)mylist=d[2];mylist=mylist.append([2]);d[2]=mylist。但它不起作用。有什么区别吗?@kingsdeb,1。你开始第二道工序了吗?2. <代码>列表。追加return
None
。它应该是:
mylist=d[2];mylist.append([2]);d[2]=我的列表
3。原子性,是的。这不是我正在研究的代码。这是我用的一个例子,这里打错了。
if 2 in d:
   d[2] = d[2] + [[2]]
else:
   d[2] = [[2]]