2017-07-25 72 views
0

我正在寻找一种通用的方法来使用多处理模块来处理参数已由位置或关键字类型(https://docs.python.org/2/glossary.html#term-parameter)定义的函数。如何在python多处理模块中使用部分函数?

下面,是我是如何处理的问题

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

“什么限制”是一个广泛的话题,但你现在面临的一个讨论更多广泛在这里:Why can I pass an instance method to multiprocessing.Process, but not a multiprocessing.Pool?

你的问题是部分的使用。它创建一个functools.partial对象作为结果,而不是一个函数。你不能将实例方法传递给Pool.map,它们需要是普通的函数。默认pickler无法腌制它们,因此错误。

这不是解决您的问题,只是解释为什么它不起作用。链接的文章中有一个解决方法是使用不同的pickler,但我从未测试过它。

相关问题