2011-01-28 52 views
32

我有以下功能:如何讓Pool.map採取lambda函數

def copy_file(source_file, target_dir): 
    pass 

現在我想用multiprocessing才能執行該功能一次:

p = Pool(12) 
p.map(lambda x: copy_file(x,target_dir), file_list) 

的問題是,lambda的不能被醃製,所以這失敗了。什麼是最整齊(pythonic)的方式來解決這個問題?

回答

45

使用函數對象:

class Copier(object): 
    def __init__(self, tgtdir): 
     self.target_dir = tgtdir 
    def __call__(self, src): 
     copy_file(src, self.target_dir) 

要運行Pool.map

p.map(Copier(target_dir), file_list) 
+2

謝謝,這確實是我所需要的! – 2011-01-28 11:10:22

+1

謝謝!我真的希望他們能夠接受lambda函數! – yeelan 2016-05-14 23:54:44

15

答案下面是欲絕,因爲這does not actually work在Python2因爲functools.partial對象(在Python2)不是picklable。

functools.partial對象在Python3中是可挑選的,所以這個解決方案在那裏工作。


你可以使用 functools.partial

import functools 
copier=functools.partial(copy_file,target_dir=target_dir) 
p.map(copier,file_list) 

0

問題是有點老,但如果你還在使用Python 2我的回答可能是有用的。

特技是用pathos項目的一部分:multiprocess多處理分叉。它擺脫了原始多進程的煩人侷限。

安裝:pip install multiprocess

用法:

>>> from multiprocess import Pool 
>>> p = Pool(4) 
>>> print p.map(lambda x: (lambda y:y**2)(x) + x, xrange(10)) 
[0, 2, 6, 12, 20, 30, 42, 56, 72, 90] 
0

this答案,悲情讓你運行你的拉姆達p.map(lambda x: copy_file(x,target_dir), file_list)直接,保存所有的解決方法/黑客