【问题标题】:python multiprocessing pickle protocolpython多处理pickle协议
【发布时间】:2011-10-27 18:32:33
【问题描述】:

我正在使用 Python 多处理模块将对象放入队列中,并由多个工作人员处理。我的第一个问题是将绑定的实例方法绑定到pickle,我正在工作,但现在我遇到了一个单独的问题,原因是对象正在使用__slots__

当 mp 模块去腌制对象时,它似乎使用的是旧的 ascii 腌制协议,无法处理 __slots__。较新的协议确实可以处理这个问题,但我不确定如何让 mp 模块使用这个协议。

有人有这方面的经验吗?

【问题讨论】:

  • 可以粘贴错误信息吗?
  • 您使用的是什么 Python 和/或多处理模块版本? 2.7 版看起来使用HIGHEST_PROTOCOL 进行酸洗。
  • @eswald:同上。我试图使用我的 2.7.1 环境复制(徒劳)这个。 :)

标签: python multiprocessing


【解决方案1】:

如果无法更改多处理包使用的 pickle 协议,则为您的对象定义 __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)

【讨论】:

  • 在搜索了 Google 之后,我最终采用了上述解决方案,实现了 getstatesetstate 方法。整个剧集迫使我学习了很多关于 Python 的新知识。
猜你喜欢
  • 2014-06-28
  • 2016-11-22
  • 1970-01-01
  • 2017-04-12
  • 2017-10-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多