【问题标题】:Python multiprocessing: cPickle.PicklingError: Can't pickle <type 'instancemethod'> [duplicate]Python 多处理:cPickle.PicklingError: Can't pickle <type 'instancemethod'> [重复]
【发布时间】:2016-05-23 04:37:39
【问题描述】:

我正在尝试使用 python multiprocessing 模块来处理大量 url,我正在使用 multiprocessing.Pool 对象为其创建工作进程,如下所示。

from multiprocessing import Pool, TimeoutError, cpu_count

class MyClass:
    def square(self, x):
        return x*x

    @staticmethod
    def getNumbers():
        return range(10)

    def calculate(self):
        pool = Pool(processes=min(cpu_count(),8))
        results = [pool.apply(self.square,(i,)) for i in self.getNumbers()]
        pool.close()
        pool.join()
        for result in results:
            print result


if __name__ == '__main__':
    instance = MyClass()
    instance.calculate()

但是上面这段代码会导致如下酸洗错误:

Traceback (most recent call last):
  File "multi.py", line 24, in <module>
    instance.calculate()
  File "multi.py", line 15, in calculate
    results = [pool.apply(self.square,(i,)) for i in self.getNumbers()]
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 244, in apply
    return self.apply_async(func, args, kwds).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get
    raise self._value
cPickle.PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

注意 之前有人在 SO 上提出过类似的问题,但仍未得到解答:cPickle.PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

EDIT给出了更好的示例代码示例

【问题讨论】:

  • 不应该 pool.apply(self.processURL, injectionPoint, "GET") 是 pool.apply(self.processURL, (injectionPoint, "GET")) 吗?
  • @Shaung 是的,抱歉在这里复制和编辑代码时出错了。现已更正。感谢您的关注:)
  • 我在以下链接上发现了一个“技巧”,但我想这是一个糟糕的 hack,不确定。请帮助我了解在multiprocessing 中酸洗&lt;type 'instancemethod'&gt;: 有什么问题,以及如何正确处理它以在类实例方法中使用。此链接上提到的技巧:rueckstiess.net/research/snippets/show/ca1d7d90

标签: python multithreading multiprocessing


【解决方案1】:

您不能使用 python 中的多处理包来腌制实例方法。实例方法未在酸洗documentation 中列出。

如果您不介意使用外部库,可以查看multiprocess,它是 python 多处理的直接替代品。 要使用该库,您需要执行以下操作:

  • pip install multiprocess
  • 将from multiprocessing import Pool, TimeoutError, cpu_count 替换为
    from multiprocess import Pool, TimeoutError, cpu_count

我已经在我的机器上测试了你的示例,它实际上是使用多进程执行的。

【讨论】:

  • 这立即奏效了。谢谢
猜你喜欢
  • 2014-09-29
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
相关资源
最近更新 更多