2011-10-27 19 views
13

Estoy utilizando el módulo de multiprocesamiento de Python para colocar objetos en una cola y que varios trabajadores los procesen. Mi primer problema fue obtener los métodos de instancia enlazados para encuadrar, que he estado trabajando, pero ahora me encuentro con un problema separado causado por el hecho de que los objetos están usando __slots__.python multiprocessing pickle protocol

Cuando el módulo mp va a recortar los objetos, parece estar utilizando el protocolo asali pickle más antiguo, que no puede manejar __slots__. El protocolo más nuevo maneja esto, pero no estoy seguro de cómo hacer que el módulo mp use este protocolo.

¿Alguien tiene alguna experiencia con esto?

+0

¿Puede pegar el mensaje de error? – ktdrv

+6

¿Qué versión de módulo de Python y/o mutiprocessing está usando? La versión 2.7 parece que usa 'HIGHEST_PROTOCOL' para decapado. – eswald

+0

@eswald: Ídem. Estaba tratando de replicar (en vano) esto utilizando mi entorno 2.7.1. :) – ktdrv

Respuesta

10

Si no es posible cambiar el protocolo pickle utiliza el paquete de multiprocesamiento, a continuación, definir __getstate__ y __setstate__ para sus objetos:

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) 
+0

Después de recorrer Google, terminé yendo con la solución anterior, implementando los métodos __getstate__ y __setstate__. Todo este episodio me obligó a aprender muchas cosas nuevas sobre Python en general. – zchtodd