【发布时间】: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中酸洗<type 'instancemethod'>:有什么问题,以及如何正确处理它以在类实例方法中使用。此链接上提到的技巧:rueckstiess.net/research/snippets/show/ca1d7d90
标签: python multithreading multiprocessing