如何在python中的多个进程之间共享字典而不锁定

如何在python中的多个进程之间共享字典而不锁定,python,multithreading,Python,Multithreading,我需要在多个进程之间共享一个巨大的字典(大约1GB大小),因为所有进程都会从中读取数据。我不需要锁 有没有办法不加锁定地共享词典 python中的多处理模块提供了一个数组类,通过设置 lock=false 然而,在多处理模块中,管理器提供的字典没有这样的选项。好吧,事实上,管理器上的dict根本没有锁!我想这对于您可以通过管理器创建的其他共享对象也是正确的。我怎么知道的?我试过: from multiprocessing import Process, Manager def f(d):

我需要在多个进程之间共享一个巨大的字典(大约1GB大小),因为所有进程都会从中读取数据。我不需要锁

有没有办法不加锁定地共享词典

python中的多处理模块提供了一个数组类,通过设置
lock=false

然而,在多处理模块中,管理器提供的字典没有这样的选项。

好吧,事实上,管理器上的dict根本没有锁!我想这对于您可以通过管理器创建的其他共享对象也是正确的。我怎么知道的?我试过:

from multiprocessing import Process, Manager

def f(d):
    for i in range(10000):
        d['blah'] += 1

if __name__ == '__main__':
    manager = Manager()

    d = manager.dict()
    d['blah'] = 0
    procs = [ Process(target=f, args=(d,)) for _ in range(10) ]
    for p in procs:
        p.start()
    for p in procs:
        p.join()

    print d
如果
d
上有锁,结果将是
100000
。但是,结果是非常随机的,因此这只是一个很好的例子,说明了为什么在修改内容时需要锁;-)


所以只要继续使用
manager.dict()

我看到了竞争条件:d['blah']+=1实际上是d['blah']=d['blah']+1,它分解得到d['blah'],添加1,然后存储在d['blah']。在那个时候,另一个过程可能会改变它。在这种情况下,管理器只是提供一个代理来访问dict。实际上,应该使用管理器在读取和添加回dict之间创建一个锁。