Проблема с блокировкой многопроцессорной обработки python

Я хочу добавить список dicts вместе с модулем многопроцессорности python.

Вот упрощенная версия моего кода:

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-

import multiprocessing
import functools
import time

def merge(lock, d1, d2):
    time.sleep(5) # some time consuming stuffs
    with lock:
        for key in d2.keys():
            if d1.has_key(key):
                d1[key] += d2[key]
            else:
                d1[key] = d2[key]

l = [{ x % 10 : x } for x in range(10000)]
lock = multiprocessing.Lock()
d = multiprocessing.Manager().dict()

partial_merge = functools.partial(merge, d1 = d, lock = lock)

pool_size = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes = pool_size)
pool.map(partial_merge, l)
pool.close()
pool.join()

print d
  1. Я получаю эту ошибку при запуске этого скрипта. Как мне решить эту проблему?

    RuntimeError: Объекты блокировки должны совместно использоваться между процессами только посредством наследования

  2. нужна ли в этом состоянии функция lock в merge ? или python позаботится об этом?

  3. Я думаю, что map должна отображать что-то из одного списка в другой список, а не сбрасывать все элементы из одного списка в один объект. Так есть ли более элегантный способ делать такие вещи?

5
задан lxyu 26 November 2011 в 07:16
поделиться