当我运行类似:
from multiprocessing import Pool
p = Pool(5)
def f(x):
return x*x
p.map(f, [1,2,3])
它工作正常。但是,将其作为类的函数:
class calculate(object):
def run(self):
def f(x):
return x*x
p = Pool()
return p.map(f, [1,2,3])
cl = calculate()
print cl.run()
给我以下错误:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/sw/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/sw/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/sw/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
我看过Alex Martelli的一篇文章,涉及类似的问题,但还不够明确。
IPython.Parallel
,但是您可以通过将对象推送到节点来解决问题。用多处理解决这个问题似乎很烦人。
calculate
是可挑剔的,因此似乎可以通过以下方法解决:1)使用复制calculate
实例的构造函数创建函数对象,然后2)将此函数对象的实例传递给Pool
的map
方法。没有?
multiprocessing
模块的某些限制是由于其目标是成为一个跨平台的实现,以及fork(2)
Windows中缺乏类似系统的调用。如果您不关心Win32支持,则可能有一个基于过程的更简单解决方法。或者,如果你准备使用的线程,而不是过程,可以替代from multiprocessing import Pool
使用from multiprocessing.pool import ThreadPool as Pool
。