我正在使用Python多处理模块将对象放置到队列中并让它们由多个工作人员处理。我的第一个问题是绑定实例方法,我已经工作,但现在我遇到了一个单独的问题,因为这些对象使用的是__slots__
。python多处理pickle协议
当mp模块去pickle的对象,它似乎是使用旧的ascii pickle协议,不能处理__slots__
。较新的协议处理这个,但我不知道如何使mp模块使用此协议。
任何人都有这方面的经验?
我正在使用Python多处理模块将对象放置到队列中并让它们由多个工作人员处理。我的第一个问题是绑定实例方法,我已经工作,但现在我遇到了一个单独的问题,因为这些对象使用的是__slots__
。python多处理pickle协议
当mp模块去pickle的对象,它似乎是使用旧的ascii pickle协议,不能处理__slots__
。较新的协议处理这个,但我不知道如何使mp模块使用此协议。
任何人都有这方面的经验?
如果它不能够改变多包使用的咸菜协议,然后定义__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)
淘谷歌之后,我最终选择了上述解决方案,实现了__getstate__和__setstate__方法。整个情节迫使我学习了许多关于Python的新东西。 – zchtodd
可以粘贴错误消息? – ktdrv
你使用什么Python和/或多处理模块版本? 2.7版本看起来像使用HIGHEST_PROTOCOL来酸洗。 – eswald
@eswald:同上。我试图用我的2.7.1环境复制(徒劳)。 :) – ktdrv