Подтвердить что ты не робот

Протокол многократной обработки питона

Я использую модуль многопроцессорности Python для размещения объектов в очереди и их обработки несколькими рабочими. Моя первая проблема заключалась в получении связанных методов экземпляра для сортировки, который у меня работает, но теперь у меня возникает отдельная проблема, вызванная тем, что объекты используют __slots__.

Когда модуль mp переходит на разбор объектов, он, похоже, использует более старый протокол ascii pickle, который не может обрабатывать __slots__. Новый протокол действительно справляется с этим, но я не уверен, как заставить модуль mp использовать этот протокол.

У кого-нибудь есть опыт?

4b9b3361

Ответ 1

Если невозможно изменить протокол рассола, используемый мультипроцессорным пакетом, затем определите __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)