Использование defaultdict с многопроцессорной обработкой?

Просто экспериментирую и учусь, и я знаю, как создать общий словарь, к которому можно получить доступ с помощью нескольких процессов, но я не уверен, как сохранить синхронизацию dict. defaultdict , я полагаю, иллюстрирует мою проблему.

from collections import defaultdict
from multiprocessing import Pool, Manager, Process

#test without multiprocessing
s = 'mississippi'
d = defaultdict(int)
for k in s:
    d[k] += 1

print d.items() # Success! result: [('i', 4), ('p', 2), ('s', 4), ('m', 1)]
print '*'*10, ' with multiprocessing ', '*'*10

def test(k, multi_dict):
    multi_dict[k] += 1

if __name__ == '__main__':
    pool = Pool(processes=4)
    mgr = Manager()
    multi_d = mgr.dict()
    for k in s:
        pool.apply_async(test, (k, multi_d))

    # Mark pool as closed -- no more tasks can be added.
    pool.close()

    # Wait for tasks to exit
    pool.join()

    # Output results
    print multi_d.items()  #FAIL

print '*'*10, ' with multiprocessing and process module like on python site example', '*'*10
def test2(k, multi_dict2):
    multi_dict2[k] += 1


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

    multi_d2 = manager.dict()
    for k in s:
        p = Process(target=test2, args=(k, multi_d2))
    p.start()
    p.join()

    print multi_d2 #FAIL

Первый результат работает (потому что он не использует многопроцессорность ), но у меня проблемы с его работой с многопроцессорностью . Я не уверен, как решить эту проблему, но я думаю, что это может быть связано с тем, что он не синхронизирован (и присоединяется к результатам позже), или, может быть, потому, что в многопроцессорности я не могу понять, как установить defaultdict ( int) в словарь.

Любая помощь или предложения о том, как заставить это работать, были бы замечательными!

9
задан jcollado 13 February 2012 в 07:25
поделиться