如何让Pool.map采用lambda函数

时间:2011-01-28 10:57:13

标签: python multiprocessing pool

我有以下功能:

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)的方法是什么?

4 个答案:

答案 0 :(得分:60)

使用功能对象:

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)

答案 1 :(得分:32)

For Python2.7+或Python3,您可以使用functools.partial

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

答案 2 :(得分:3)

问题有点旧,但如果你仍然使用Python 2,我的答案可能会有用。

Trick是使用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]

答案 3 :(得分:0)

this回答,悲情让你直接运行你的lambda p.map(lambda x: copy_file(x,target_dir), file_list),保存所有的变通方法/黑客