【问题标题】:how to use the partial function with the python multiprocessing module?如何在 python 多处理模块中使用部分函数?
【发布时间】:2017-07-25 04:31:57
【问题描述】:

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

谢谢

【问题讨论】:

    标签: python python-2.7 multiprocessing


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-24
      相关资源
      最近更新 更多