Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何让Pool.map接受lambda函数_Python_Multiprocessing_Pool - Fatal编程技术网

Python 如何让Pool.map接受lambda函数

Python 如何让Pool.map接受lambda函数,python,multiprocessing,pool,Python,Multiprocessing,Pool,我有以下功能: def copy_file(source_file, target_dir): pass 现在我想使用多处理立即执行此函数: p = Pool(12) p.map(lambda x: copy_file(x,target_dir), file_list) 问题是,lambda's不能腌制,所以它失败了。解决此问题的最简洁(pythonic)方法是什么?使用函数对象: class Copier(object): def __init__(self, tgtdir

我有以下功能:

def copy_file(source_file, target_dir):
    pass
现在我想使用
多处理
立即执行此函数:

p = Pool(12)
p.map(lambda x: copy_file(x,target_dir), file_list)
问题是,lambda's不能腌制,所以它失败了。解决此问题的最简洁(pythonic)方法是什么?

使用函数对象:

class Copier(object):
    def __init__(self, tgtdir):
        self.target_dir = tgtdir
    def __call__(self, src):
        copy_file(src, self.target_dir)
要运行您的
池.map

p.map(Copier(target_dir), file_list)
或者Python3,您可以使用:


这个问题有点老了,但若你们仍然在使用Python2,我的答案可能会很有用

诀窍是使用项目的一部分:多处理分支。它摆脱了原有多进程的烦人限制

安装:
pip安装多进程

用法:

>>> 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]

从answer,pathos让你直接运行你的lambda
p.map(lambda x:copy_file(x,target_dir),file_list)
,保存所有的解决方法/黑客

谢谢,这确实是我需要的!谢谢我真希望他们能接受lambda函数!如果
copy\u file
self.copy\u file
中的一个方法,该怎么办?这个方法甚至看起来更干净。。。稍后我将决定使用哪一个作为我的答案,这个答案仍然是a+1,因为它较短(在Python 3中,也就是;),作为更新
functools在这里登陆要晚得多。在Python 2.7中,partial
也是可以选择的。这个解决方案最好使用它来修复对非同构图的并行搜索。它比Fred Foo的解决方案快15倍
>>> 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]