Python多处理:cPickle.PicklingError:不能腌制<type'instancemethod'=“”>

时间:2016-02-12 05:48:47

标签: python multithreading multiprocessing

我正在尝试使用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

注意 之前已经有人向其他人提出类似的问题,但仍未得到答复:cPickle.PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

编辑提供更好的示例代码示例

2 个答案:

答案 0 :(得分:0)

你不能使用python中的多处理包来挑选实例方法。实例方法未列在酸洗documentation

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

  • pip install multiprocess

  • 替换from multiprocessing import Pool, TimeoutError, cpu_count from multiprocess import Pool, TimeoutError, cpu_count

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

答案 1 :(得分:-1)

对于偶然发现此问题的任何人,请阅读以下链接中接受的答案:Python multiprocessing pickling error