如何在进程之间共享多个词典

时间:2016-06-14 21:17:17

标签: python python-3.x multiprocessing

我将多处理程序包用于多层应用程序,我想在几个进程中共享多个dicts。

我已经找到了multiprocessing.Manager类,但似乎每个应用程序只提供一个dict(Manager.dict())。对我来说,它看起来像singleton object

有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

据我所知,单个Manager实例可以管理多个独立的dict。这是一个简单的例子:

from multiprocessing import Process, Manager

def f(x, d1, d2):
    if x == 1:
        d1['foo'] = 'bar'
    if x == 2:
        d2['bar'] = 'foo'
    print x, d1, d2
    return x*x

if __name__ == '__main__':
    manager = Manager()
    d1 = manager.dict()
    d2 = manager.dict()
    p1 = Process(target=f, args=(1, d1, d2))
    p2 = Process(target=f, args=(2, d1, d2))
    p3 = Process(target=f, args=(3, d1, d2))
    processes = [p1, p2, p3]
    for p in processes:
        p.start()
    for p in processes:
        p.join()

我得到以下输出:

3 {'foo': 'bar'} {}
1 {'foo': 'bar'} {}
2 {'foo': 'bar'} {'bar': 'foo'}

根据哪个进程最快进入dict的锁定,存在变化:

mgilson:$ python ~/sandbox/test.py
3 {'foo': 'bar'} {}
1 {'foo': 'bar'} {}
2 {'foo': 'bar'} {'bar': 'foo'}
mgilson:$ python ~/sandbox/test.py
1 {'foo': 'bar'} {'bar': 'foo'}
2 {'foo': 'bar'} {'bar': 'foo'}
3 {'foo': 'bar'} {'bar': 'foo'}
mgilson:$ python ~/sandbox/test.py
1 {'foo': 'bar'} {'bar': 'foo'}
3 {'foo': 'bar'} {'bar': 'foo'}
2 {'foo': 'bar'} {'bar': 'foo'}
mgilson:$ python ~/sandbox/test.py
1 {'foo': 'bar'} {}
2 {'foo': 'bar'} {'bar': 'foo'}
3 {'foo': 'bar'} {'bar': 'foo'}

但很明显,在每种情况下,词典都是不同的(它们有不同的键)。

FWIW,我正在使用OS-X。 multiprocessing如何在Windows上与其他可能在这里发挥作用的其他* Nix系统一起工作有一些细微之处......