#python #multiprocessing
#python #многопроцессорная обработка
Вопрос:
Я использую модуль многопроцессорной обработки Python для размещения объектов в очереди и их обработки несколькими рабочими. Моей первой проблемой было получение привязанных методов экземпляра для pickle, с которыми я работаю, но теперь я столкнулся с отдельной проблемой, вызванной тем фактом, что объекты используются __slots__
.
Когда модуль mp отправляется для обработки объектов, он, похоже, использует более старый протокол pickle ascii, который не может обрабатывать __slots__
. Более новый протокол справляется с этим, но я не уверен, как заставить модуль mp использовать этот протокол.
У кого-нибудь есть опыт работы с этим?
Комментарии:
1. Можете ли вы вставить сообщение об ошибке?
2. Какую версию модуля Python и / или mutiprocessing вы используете? Версия 2.7 выглядит так, как будто она используется
HIGHEST_PROTOCOL
для маринования.3. @eswald: То же самое. Я пытался воспроизвести (тщетно) это, используя мою среду 2.7.1. 🙂
Ответ №1:
Если невозможно изменить протокол pickle, используемый многопроцессорным пакетом, затем определите __getstate__
и __setstate__
для ваших объектов:
import pickle
class Foo(object):
__slots__ = ['this', 'that', 'other']
def __init__(self):
self.this = 1
self.that = 2
self.other = 3
def __getstate__(self):
return dict((name, getattr(self, name))
for name in self.__slots__)
def __setstate__(self, state):
for name, value in state.items():
setattr(self, name, value)
pickle.dumps(Foo(), protocol=0)
Комментарии:
1. После поиска в Google я в конечном итоге выбрал вышеупомянутое решение, реализовав методы getstate и setstate . Весь этот эпизод заставил меня узнать много нового о Python в целом.