в Python, использующем модуль многопроцессорной обработки, как я могу определить, какой объект вызвал ошибку PicklingError?

#python #multiprocessing

#python #многопроцессорная обработка

Вопрос:

У меня сложная программа на Python. Я пытаюсь использовать пул многопроцессорных процессов для его распараллеливания. Я получаю сообщение об ошибке

PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed .

Обратная трассировка показывает состояния return send(obj)

Моя гипотеза заключается в том, что это «obj», который вызывает проблему, и что мне нужно сделать его доступным для настройки.

Как я могу определить, какой объект является причиной проблемы? Программа сложная, и простое угадывание может занять много времени.

Ответ №1:

Почему бы просто не добавить некоторые записи непосредственно перед отправкой возврата (obj)? Как минимум, это может помочь:

 print repr(obj)
return send(obj)
  

Или печатать только тогда, когда это приводит к ошибке:

 try:
   return send(obj)
except:
   print '***', repr(obj)
   raise
  

Ответ №2:

Ошибка, которую вы видите, может быть вызвана передачей неправильного типа функции в многопроцессорную обработку.Методы пула. Переданная функция должна быть импортирована напрямую из ее родительского модуля. Например, это не может быть метод класса.