我正在寻找一种通用方法,将多处理模块用于参数已由位置OR关键字类型(https://docs.python.org/2/glossary.html#term-parameter)定义的函数。
下面是我如何解决问题的简单示例
from functools import partial
from multiprocessing import Pool
def VariadicLifter(func, args):
return func(*args)
def func(x,y,z,a):
return x+2*y+3*z+4*a
if __name__ == '__main__':
func_ = partial( func, 500, 1007)
lfunc_ = partial( VariadicLifter, func_)
RANGE = zip( range(10,31),range(10,31) )
pool = Pool(processes=6)
result_array = pool.map( lfunc_, RANGE )
pool.close()
pool.join()
这有效:每次调用lfunc_的结果都可以在result_array中找到。
现在,我尝试在另一个上下文中应用此模式,然后收到错误消息。
File "c:\Python27\lib\multiprocessing\pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "c:\Python27\lib\multiprocessing\pool.py", line 567, in get
raise self._value
cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
但如果我用常规地图替换多处理地图,程序就没有问题。 多处理池的函数参数是否有任何限制? (我的理解是,至少,lambda函数不能与多处理池一起使用)
由于
答案 0 :(得分:0)
&#34;有什么限制&#34;这是一个广泛的主题,但你现在面对的是一个更广泛的讨论:Why can I pass an instance method to multiprocessing.Process, but not a multiprocessing.Pool?
你的问题是使用偏。它创建了一个functools.partial对象,而不是一个函数。您无法将实例方法传递给Pool.map
,它们必须是普通函数。默认的pickler无法腌制它们,因此出错。
这不是您问题的解决方案,只是解释为什么它不起作用。链接文章中有一个解决方法,使用不同的pickler,但我从未测试过它。