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

Я написал хороший процессор параллельных заданий, который принимает задания (функции, их аргументы, информацию о тайм-ауте и т. Д.) И отправляет их в Python multiprocessing. Я могу предоставить полный (длинный) код, если потребуется, но ключевым шагом (как я его вижу) является асинхронное приложение для пула:

job.resultGetter = self.pool.apply_async(
    func = job.workFunction,
    kwds = job.workFunctionKeywordArguments
)

Я пытаюсь использовать этот процессор параллельных заданий с большим объемом устаревшего кода и, возможно, естественно, наткнулся на травление:

PicklingError: Can’t pickle <type ’instancemethod’>: attribute lookup builtin .instancemethod failed

Этот тип проблемы наблюдается, когда я пытаюсь отправить проблемный объект в качестве аргумента для рабочей функции. Настоящая проблема в том, что это устаревший код, и мне советуют вносить в него только очень незначительные изменения. Итак ... есть ли какой-нибудь хитрый трюк или простая модификация, которую я могу где-нибудь сделать, чтобы мой код параллельного процессора заданий мог справиться с этими традиционно неотбираемыми объектами? У меня есть полный контроль над кодом процессора параллельных заданий, поэтому я открыт, например, для того, чтобы заключить каждую отправленную функцию в другую функцию. Что касается унаследованного кода, я должен иметь возможность добавлять случайные небольшие методы к объектам, но это все. Есть ли какой-нибудь умный подход к этому типу проблемы?


person d3pd    schedule 27.01.2014    source источник


Ответы (1)


используйте dill и pathos.multiprocessing вместо pickle и multiprocessing.

см. здесь: Что могут делать многопроцессорность и укроп вместе?

http://matthewrocklin.com/blog/work/2013/12/05/Parallelism-and-Serialization/

Как обрабатывать функции / классы, определенные в __main__ ( питон)

person Mike McKerns    schedule 30.01.2014
comment
Большое спасибо за ваше предложение. К сожалению, я ограничен тем, что multiprocessing считается проверенным в тех усилиях, в которых я участвую, в то время как более современные его обновления и аналогичные методы параллельной обработки - нет. Однако я буду экспериментировать. Спасибо - person d3pd; 16.03.2014
comment
Что ж, вы могли бы привести доводы в пользу форка многопроцессорности, поскольку это просто старая версия многопроцессорности, в которой сотни или две строки попыток сериализации этого модуля были извлечены и заменены укропом импорта одной строки. Dill - это в первую очередь рассол python с некоторыми дополнительными методами сериализации, зарегистрированными в реестре pickle. Однако похоже, что это не поможет вам считать их проверенными - переводится ли проверенный в стандартную библиотеку Python или что-то вроде EPD / Anaconda? - person Mike McKerns; 16.03.2014