Pythonではmultiprocessing
pool.map
ライブラリには、複数の引数をサポートするバリアントがありますか?
import multiprocessing
text = "test"
def harvester(text, case):
X = case[0]
text + str(X)
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=6)
case = RAW_DATASET
pool.map(harvester(text, case), case, 1)
pool.close()
pool.join()
ベストアンサー1
複数の引数をサポートする pool.map のバリアントはありますか?
Python 3.3には以下が含まれますpool.starmap()
方法:
#!/usr/bin/env python3
from functools import partial
from itertools import repeat
from multiprocessing import Pool, freeze_support
def func(a, b):
return a + b
def main():
a_args = [1,2,3]
second_arg = 1
with Pool() as pool:
L = pool.starmap(func, [(1, 1), (2, 1), (3, 1)])
M = pool.starmap(func, zip(a_args, repeat(second_arg)))
N = pool.map(partial(func, b=second_arg), a_args)
assert L == M == N
if __name__=="__main__":
freeze_support()
main()
古いバージョンの場合:
#!/usr/bin/env python2
import itertools
from multiprocessing import Pool, freeze_support
def func(a, b):
print a, b
def func_star(a_b):
"""Convert `f([1,2])` to `f(1,2)` call."""
return func(*a_b)
def main():
pool = Pool()
a_args = [1,2,3]
second_arg = 1
pool.map(func_star, itertools.izip(a_args, itertools.repeat(second_arg)))
if __name__=="__main__":
freeze_support()
main()
出力
1 1
2 1
3 1
注目してくださいitertools.izip()
そしてitertools.repeat()
ここで使用されます。
により@unutbu が言及したバグ使えないfunctools.partial()
またはPython 2.6に類似の機能があるため、単純なラッパー関数をfunc_star()
明示的に定義する必要があります。回避策 によって提案されましたuptimebox
。