Python 在进程之间修改共享dict对象不会';行不通
我想我已经在这里找到了一个类似的问题,但是没有找到一个我能很容易理解的好的解释。我也试图阅读python文档,但也没有找到详细的解释 下面是代码: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
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]]