web-dev-qa-db-ja.com

Pool.mapにラムダ関数を使用させる方法

次の機能があります。

def copy_file(source_file, target_dir):
    pass

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

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

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

57
Peter Smit

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

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)
62
Fred Foo

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

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

質問は少し古いですが、それでも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]
3
petRUShka

this の回答から、pathosはラムダp.map(lambda x: copy_file(x,target_dir), file_list)を直接実行して、すべての回避策/ハックを保存しましょう

0
Rufus