многопроцессорный протокол pickle на python

#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 в целом.