簡體   English   中英

如何在python多處理模塊中使用部分函數?

[英]how to use the partial function with the python multiprocessing module?

我正在尋找對函數使用多重處理模塊的通用方法,該函數的參數已由position-OR-keyword類型( 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

但是,如果我將多處理圖替換為常規圖,則程序運行不會出現問題。 多處理池的function參數是否有限制? (我的理解是,至少lambda函數不能與多處理池一起使用)

謝謝

“有哪些局限性”是一個廣泛的話題,但是現在您將面對的局限性在這里得到了更廣泛的討論: 為什么我可以將實例方法傳遞給multiprocessing.Process,而不傳遞給multiprocessing.Pool?

您的問題是使用局部。 結果將創建一個functools.partial對象,而不是一個函數。 您不能將實例方法傳遞給Pool.map ,它們必須是普通函數。 默認的腌制者無法腌制它們,因此會出現錯誤。

這不是解決您的問題的方法,只是解釋為什么它不起作用。 鏈接的文章中有一個使用其他Pickler的解決方法,但我從未測試過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM