次の機能があります。
def copy_file(source_file, target_dir):
pass
ここで、multiprocessing
を使用してこの関数を一度に実行したいと思います。
p = Pool(12)
p.map(lambda x: copy_file(x,target_dir), file_list)
問題は、ラムダをピクルスにすることができないため、失敗することです。これを修正する最もきちんとした(Pythonic)方法は何ですか?
関数オブジェクトを使用します。
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)
Python2.7 + またはPython3の場合、 functools.partial を使用できます。
import functools
copier = functools.partial(copy_file, target_dir=target_dir)
p.map(copier, file_list)
質問は少し古いですが、それでも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]
this の回答から、pathosはラムダp.map(lambda x: copy_file(x,target_dir), file_list)
を直接実行して、すべての回避策/ハックを保存しましょう