2016-06-14 6 views
1

Я использую пакет многопроцессорности для многоуровневого приложения, и я хочу разделить несколько диктонов в нескольких процессах.Как делиться несколькими словарями между процессами

Я нашел класс multiprocessing.Manager уже, но кажется, что он содержит только один dict (Manager.dict()) для каждого приложения. Для меня это похоже на что-то вроде singleton object.

Может кто-нибудь мне помочь?

+0

Что заставляет вас думать, что это объекты одноэлементного? Я не вижу ничего в документации, которая заставляет меня думать, что у вас не может быть более одного (хотя, чем больше у вас менеджеров, тем меньше вы будете получать выгоды от многопроцессорности) – mgilson

+0

Я создал несколько экземпляров раз, то я добавил пары ключ-значение. Каждая пара ключ-значение появилась во всех «экземплярах». Кроме того, я не смог найти какой-либо пример/передовой опыт/pythonic способ поделиться несколькими словарями. Все примеры выглядят как [this] (https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes). –

+0

Вы хотите * изменить * dicts? Потому что, если вам не нужно это делать, вы можете просто создать dicts * до * создания экземпляров 'Process', и каждый« Process »будет« наследовать »их. –

ответ

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'} 

Существует вариация в зависимости от того, какой процесс получает замок в Словаре самый быстрый:

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, которые могут вступить в игру здесь ...