Python多处理:cPickle.PicklingError:Can';t pickle<;类型';instancemethod'&燃气轮机;
我试图使用pythonPython多处理: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
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”)
bepool.apply(self.processURL,(injectionPoint,“GET”)
?@Shaung是的,很抱歉在这里复制和编辑代码时出错。现在更正。谢谢注意:)我在下面的链接上发现了一个“窍门”,但我猜这是一个糟糕的黑客,不确定。请帮助我了解多处理中的酸洗:
有什么问题,以及如何正确处理该问题以便在类实例方法中使用。此链接中提到的技巧: