multiprocessing
found inの fork と同様に、複数の引数を許可する map 関数を使用できますpathos
。
>>> from pathos.multiprocessing import ProcessingPool as Pool
>>>
>>> def add_and_subtract(x,y):
... return x+y, x-y
...
>>> res = Pool().map(add_and_subtract, range(0,20,2), range(-5,5,1))
>>> res
[(-5, 5), (-2, 6), (1, 7), (4, 8), (7, 9), (10, 10), (13, 11), (16, 12), (19, 13), (22, 14)]
>>> Pool().map(add_and_subtract, *zip(*res))
[(0, -10), (4, -8), (8, -6), (12, -4), (16, -2), (20, 0), (24, 2), (28, 4), (32, 6), (36, 8)]
pathos
を使用すると、複数の入力を持つ階層的な並列マップを簡単にネストできるため、例を拡張してそれを実証できます。
>>> from pathos.multiprocessing import ThreadingPool as TPool
>>>
>>> res = TPool().amap(add_and_subtract, *zip(*Pool().map(add_and_subtract, range(0,20,2), range(-5,5,1))))
>>> res.get()
[(0, -10), (4, -8), (8, -6), (12, -4), (16, -2), (20, 0), (24, 2), (28, 4), (32, 6), (36, 8)]
さらに楽しいのは、Pool に渡すことができるネストされた関数を作成することです。これは、Python でほとんど何でもシリアル化できる をpathos
使用しているため可能です。dill
>>> def build_fun_things(f, g):
... def do_fun_things(x, y):
... return f(x,y), g(x,y)
... return do_fun_things
...
>>> def add(x,y):
... return x+y
...
>>> def sub(x,y):
... return x-y
...
>>> neato = build_fun_things(add, sub)
>>>
>>> res = TPool().imap(neato, *zip(*Pool().map(neato, range(0,20,2), range(-5,5,1))))
>>> list(res)
[(0, -10), (4, -8), (8, -6), (12, -4), (16, -2), (20, 0), (24, 2), (28, 4), (32, 6), (36, 8)]
ただし、標準ライブラリの外に出られない場合は、別の方法で行う必要があります。その場合の最善の策は、ここに示すように使用するmultiprocessing.starmap
ことです:複数の引数の Python multiprocessing pool.map (OP の投稿のコメントで @Roberto によって指摘されています)
pathos
ここにアクセスしてください: https://github.com/uqfoundation