[英]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.