我将多处理程序包用于多层应用程序,我想在几个进程中共享多个dicts。
我已经找到了multiprocessing.Manager类,但似乎每个应用程序只提供一个dict(Manager.dict())。对我来说,它看起来像singleton object。
有人能帮助我吗?
答案 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系统一起工作有一些细微之处......