Причина, по которой вы получаете это исключение, заключается в том, что multiprocessing
должен иметь возможность выбирать переменных, которые вы передаете своим работникам, чтобы передавать их между различными процессами, которые он порождает.
Ошибка:
TypeError: can't pickle module objects
Предполагает, что одна из переменных, которые вы передаете в Pool
, содержит модуль (или класс, у которого модуль является атрибутом).
Чтобы продемонстрировать проблему, взгляните на эти два класса:
import os
class Pickable:
a = 1
class UnPickable:
def __init__(self):
self.mod = os
Если вы попытаетесь выбрать экземпляры этих двух классов, вы получите:
In [11]: pickle.dumps(Pickable())
Out[11]: b'\x80\x03c__main__\nPickable\nq\x00)\x81q\x01.'
In [10]: pickle.dumps(UnPickable())
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-7d4d725a1c6d> in <module>()
----> 1 pickle.dumps(UnPickable())
TypeError: can't pickle module objects
Токак говорится - либо вы создаете свой собственный класс, который имитирует функциональность mx.mod.Module
, но является сериализуемым, - ИЛИ (на мой взгляд, лучшее решение) использует простые встроенные в Python типы для передачи переменных в рабочие элементы вашего Pool
и конструирования mx.mod.Module
экземпляры внутри них сами по себе.