我正在尝试使用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
编辑提供更好的示例代码示例
答案 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