2011-10-27 52 views
13

我正在使用Python多处理模块将对象放置到队列中并让它们由多个工作人员处理。我的第一个问题是绑定实例方法,我已经工作,但现在我遇到了一个单独的问题,因为这些对象使用的是__slots__python多处理pickle协议

当mp模块去pickle的对象,它似乎是使用旧的ascii pickle协议,不能处理__slots__。较新的协议处理这个,但我不知道如何使mp模块使用此协议。

任何人都有这方面的经验?

+0

可以粘贴错误消息? – ktdrv

+6

你使用什么Python和/或多处理模块版本? 2.7版本看起来像使用HIGHEST_PROTOCOL来酸洗。 – eswald

+0

@eswald:同上。我试图用我的2.7.1环境复制(徒劳)。 :) – ktdrv

回答

10

如果它不能够改变多包使用的咸菜协议,然后定义__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) 
+0

淘谷歌之后,我最终选择了上述解决方案,实现了__getstate__和__setstate__方法。整个情节迫使我学习了许多关于Python的新东西。 – zchtodd