Как избежать этой ошибки травления, и как лучше всего распараллелить этот код в Python?

У меня есть следующий код.

def main(): (minI, maxI, iStep, minJ, maxJ, jStep, a, b, numProcessors) = sys.argv for i in range(minI, maxI, iStep): for j in range(minJ, maxJ, jStep): p = multiprocessing.Process(target=functionA, args=(minI, minJ)) p.start() def functionB((a, b)): subprocess.call('program1 %s %s %s %s %s %s' %(c, a, b, 'file1', 'file2', 'file3'), shell=True) for d in ['a', 'b', 'c']: subprocess.call('program2 %s %s %s %s %s' %(d, 'file4', 'file5', 'file6', 'file7'), shell=True) abProduct = list(itertools.product(range(0, 10), range(0, 10))) pool = multiprocessing.Pool(processes=numProcessors) pool.map(functionB, abProduct) 

Он вызывает следующую ошибку.

 Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib64/python2.6/threading.py", line 532, in __bootstrap_inner self.run() File "/usr/lib64/python2.6/threading.py", line 484, in run self.__target(*self.__args, **self.__kwargs) File "/usr/lib64/python2.6/multiprocessing/pool.py", line 255, in _handle_tasks put(task) PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function fa iled 

Содержимое функции A не имеет значения и не вызывает ошибки. Ошибка возникает, когда я пытаюсь отобразить функциюB. Как удалить эту ошибку и как лучше всего распараллелить этот код в Python 2.6?

One Solution collect form web for “Как избежать этой ошибки травления, и как лучше всего распараллелить этот код в Python?”

Причина, по которой вы, скорее всего, видите это поведение, связана с порядком, в котором вы определяете свой пул, объекты и функции. multiprocessing не совсем такая же, как при использовании потоков. Каждый процесс будет порождать и загружать копию окружения. Если вы создаете функции в областях, которые могут быть недоступны для процессов, или создавать объекты перед пулом, то пул будет терпеть неудачу.

Сначала попробуйте создать один пул перед вашей большой петлей:

 (minI, maxI, iStep, minJ, maxJ, jStep, a, b, numProcessors) = sys.argv pool = multiprocessing.Pool(processes=numProcessors) for i in range(minI, maxI, iStep): ... 

Затем переместите цель, которая вызывается вне динамического цикла:

 def functionB(a, b): ... def main(): ... 

Рассмотрим этот пример …

сломанный

 import multiprocessing def broken(): vals = [1,2,3] def test(x): return x pool = multiprocessing.Pool() output = pool.map(test, vals) print output broken() # PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 

за работой

 import multiprocessing def test(x): return x def working(): vals = [1,2,3] pool = multiprocessing.Pool() output = pool.map(test, vals) print output working() # [1, 2, 3] 
  • Найти дубликаты для значений смешанного типа в словарях
  • Pickle отказывается сериализовать контент с помощью отчета о сельдере. ContentDisallowed: отказ от десериализации недоверенного содержимого типа pickle
  • сериализация и десериализация лямбда
  • Обертывание частичных функций
  • Многопроцессорность: как использовать Pool.map для функции, определенной в классе?
  • Python - лучший язык программирования в мире.