python multiprocessing pickle-protocol

Ik gebruik de Python-multiprocessingmodule om objecten in een wachtrij te plaatsen en ze door meerdere werknemers te laten verwerken. Mijn eerste probleem was het verkrijgen van ingebonden instantiemethoden om in te nemen, wat ik heb gedaan, maar nu kom ik een ander probleem tegen doordat de objecten __ slots __ gebruiken.

Wanneer de mp-module de objecten gaat inpikken, lijkt het het oudere ascii-pickle-protocol te gebruiken, dat __ slots __ niet aankan. Het nieuwere protocol verwerkt dit wel, maar ik weet niet zeker hoe de mp-module dit protocol moet gebruiken.

Heeft iemand hier enige ervaring mee?

13
Kun je het foutbericht plakken?
toegevoegd de auteur ktdrv, de bron
@eswald: idem. Ik probeerde dit (tevergeefs) te repliceren met mijn 2.7.1-omgeving. :)
toegevoegd de auteur ktdrv, de bron
Welke module-versie van Python en/of mutiprocessing gebruikt u? Versie 2.7 ziet eruit alsof het HIGHEST_PROTOCOL gebruikt voor het beitsen.
toegevoegd de auteur eswald, de bron
Dit is met 2.6.5.
toegevoegd de auteur zchtodd, de bron

1 antwoord

Als het niet mogelijk is om het pickle-protocol te wijzigen dat het multiprocessing-pakket gebruikt, definieer dan __ getstate __ en __ setstate __ voor uw objecten:

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)
11
toegevoegd
Na het doorzoeken van Google heb ik uiteindelijk de bovenstaande oplossing gevolgd door de getstate en setstate methoden te implementeren. Deze hele aflevering dwong me om veel nieuwe dingen over Python in het algemeen te leren.
toegevoegd de auteur zchtodd, de bron