我正在寻找一种通用方法,将多处理模块用于参数已由位置或关键字类型(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:Python27libmultiprocessingpool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "c:Python27libmultiprocessingpool.py", line 567, in get
raise self._value
cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
但是如果我用常规映射替换多处理映射,程序运行没有问题。 多处理池的函数参数是否有任何限制? (我的理解是,至少 lambda 函数不能与多处理池一起使用(
谢谢
"有哪些限制"是一个广泛的话题,但您现在面临的问题在这里进行了更广泛的讨论:为什么我可以将实例方法传递给多处理。进程,但不是多处理。池?
你的问题是使用部分。它创建一个 functools.partial 对象作为结果,而不是一个函数。您不能将实例方法传递给Pool.map
,它们必须是普通函数。默认的拾取器无法腌制它们,因此出现错误。
这不是您问题的解决方案,只是解释为什么它不起作用。链接的文章中有一个不同的拾取器的解决方法,但我从未测试过它。