Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多处理:cPickle.PicklingError:Can';t pickle<;类型';instancemethod'&燃气轮机;_Python_Multithreading_Multiprocessing - Fatal编程技术网

Python多处理:cPickle.PicklingError:Can';t pickle<;类型';instancemethod'&燃气轮机;

Python多处理:cPickle.PicklingError:Can';t pickle<;类型';instancemethod'&燃气轮机;,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,我试图使用pythonmultiprocessing模块来处理大量URL,我正在使用multiprocessing.Pool对象为这些URL创建工作进程,如下所示 from multiprocessing import Pool, TimeoutError, cpu_count class MyClass: def square(self, x): return x*x @staticmethod def getNumbers(): r

我试图使用python
multiprocessing
模块来处理大量URL,我正在使用
multiprocessing.Pool
对象为这些URL创建工作进程,如下所示

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
回溯(最近一次呼叫最后一次):
文件“multi.py”,第24行,在
instance.calculate()
文件“multi.py”,第15行,在计算中
结果=[pool.apply(self.square,(i,))表示self.getNumbers()中的i]
文件“/usr/lib/python2.7/multiprocessing/pool.py”,第244行,在apply中
返回self.apply\u async(func、args、kwds).get()
get中的文件“/usr/lib/python2.7/multiprocessing/pool.py”,第558行
提升自我价值
cPickle.PicklingError:无法pickle:属性查找\uuuu内置\uuuuu。instancemethod失败
注意 之前有人问过类似的问题,但仍然没有回答:


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

您不能使用python中的多处理包来pickle实例方法。实例方法未在pickling中列出

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

  • pip安装多进程

  • 来自多进程导入池、超时错误、cpu\u计数

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

不应该
pool.apply(self.processURL,injectionPoint,“GET”)
be
pool.apply(self.processURL,(injectionPoint,“GET”)
?@Shaung是的,很抱歉在这里复制和编辑代码时出错。现在更正。谢谢注意:)我在下面的链接上发现了一个“窍门”,但我猜这是一个糟糕的黑客,不确定。请帮助我了解
多处理中的酸洗
有什么问题,以及如何正确处理该问题以便在类实例方法中使用。此链接中提到的技巧: