Насколько я могу судить, один экземпляр 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'}
Существует вариация в зависимости от того, какой процесс получает замок в Словаре самый быстрый:
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 vs другие системы * Nix, которые могут вступить в игру здесь ...
Что заставляет вас думать, что это объекты одноэлементного? Я не вижу ничего в документации, которая заставляет меня думать, что у вас не может быть более одного (хотя, чем больше у вас менеджеров, тем меньше вы будете получать выгоды от многопроцессорности) – mgilson
Я создал несколько экземпляров раз, то я добавил пары ключ-значение. Каждая пара ключ-значение появилась во всех «экземплярах». Кроме того, я не смог найти какой-либо пример/передовой опыт/pythonic способ поделиться несколькими словарями. Все примеры выглядят как [this] (https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes). –
Вы хотите * изменить * dicts? Потому что, если вам не нужно это делать, вы можете просто создать dicts * до * создания экземпляров 'Process', и каждый« Process »будет« наследовать »их. –