如何在python多处理模块中使用partial函数?

时间:2017-07-25 04:31:58

标签: python python-2.7 multiprocessing

我正在寻找一种通用方法,将多处理模块用于参数已由位置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函数不能与多处理池一起使用)

由于

1 个答案:

答案 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,但我从未测试过它。