Как избежать этой ошибки травления, и как лучше всего распараллелить этот код в 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] 
  • Хранение словарей Python
  • Многопроцессорность: ошибка пула и рассола - ошибка травления: не может pickle <type 'instancemethod'>: поиск атрибута __builtin __. Instancemethod failed
  • Многопроцессорность: как использовать Pool.map для функции, определенной в классе?
  • multiprocessing.Pool - PicklingError: не может pickle <type 'thread.lock'>: поиск атрибута thread.lock не удалось
  • Как я могу выбрать вложенный класс в python?
  • Почему я могу передать метод экземпляра для multiprocessing.Process, но не многопроцессорный.Pool?
  • Есть ли альтернатива pickle - сохранить словарь (python)
  •  
    Interesting Posts for Van-Lav

    Разница между генерацией случайных чисел C ++ и Python

    Как создать скрипт python, который может выйти из системы, завершить работу и перезагрузить компьютер?

    Как отсортировать словарь с ключами в виде строки чисел в Python

    Как переписать рекурсивную функцию для использования цикла?

    Использовать Scikit. Учиться выполнять линейную регрессию в рамке данных панд-кадров временного ряда.

    Что такое идиоматический способ вызова списка функций в Python?

    Любые «красивые» библиотеки визуализации данных для Python?

    как преобразовать строку в допустимое имя переменной в python?

    Проблемы с установкой python3 на RHEL

    Как заставить ширину поля заголовка охватывать весь участок?

    Вход в два файла с различными настройками

    Тензорный поток: Отмена (сбрасывание ядра)

    Десятичный десятичный код Python. Ценная точность не соответствует вольфрам-альфа

    установка предела оси y в matplotlib

    установить соотношение сторон 3D-графика matplotlib?

    Python - лучший язык программирования в мире.