У меня есть метод класса, который я хотел бы использовать с multiprocessing.Pool для распараллеливания. Поскольку экземпляры классов не могут быть засолены, я использовал следующее:
import copy_reg
import types
def _reduce_method(m):
if m.im_self is None:
return getattr, (m.im_class, m.im_func.func_name)
else:
return getattr, (m.im_self, m.im_func.func_name)
copy_reg.pickle(types.MethodType, _reduce_method)
Это работает без проблем. Однако в моем классе я использую модуль GDAL (https://pypi.org/project/GDAL/) для манипулирования геопространственными изображениями и данными. Итак, теперь я получаю следующую ошибку:
cPickle.PicklingError: Can't pickle <type 'SwigPyObject'>: attribute lookup __builtin__.SwigPyObject failed
Я использую Python 2.7.10. Я знаю, что мог бы решить свою проблему с пулом с помощью Python 3 или с помощью Pathos вместо многопроцессорной обработки, но я не могу легко выполнить ни одно из этих действий из-за сетевых ограничений на моем компьютере.
Я потратил немного времени на поиск решения, но безрезультатно. Я нашел некоторые потенциальные решения (например, Как заставить мой модуль расширения SWIG работать с Pickle? ), но я не уверен, как их реализовать, так как я не намеренно создаю объект SWIG в своем коде , но это должно прийти в какой-то момент из-за GDAL.
Есть ли способ зарегистрировать тип 'SwigPyObject' как с возможностью копирования с использованием copy_reg, как я делал с типом 'instancemethod' выше?