73

私は次の機能を持っています:

def copy_file(source_file, target_dir):
    pass

multiprocessingここで、この関数を一度に実行するために使用したいと思います。

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

問題は、ラムダはピクルスにできないため、これは失敗することです。これを修正する最もきちんとした (pythonic) 方法は何ですか?

4

4 に答える 4

72

関数オブジェクトを使用します。

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)
于 2011-01-28T11:06:32.227 に答える
65

Python2.7+または Python3 の場合、 functools.partial を使用できます

import functools
copier = functools.partial(copy_file, target_dir=target_dir)
p.map(copier, file_list)
于 2011-01-28T13:26:55.647 に答える
1

この回答から、pathos を使用すると、ラムダを直接実行してp.map(lambda x: copy_file(x,target_dir), file_list)、すべての回避策/ハックを保存できます

于 2017-01-16T06:19:36.250 に答える