複数の引数を持つマルチプロセッシング pool.map の使用方法 質問する

複数の引数を持つマルチプロセッシング pool.map の使用方法 質問する

Pythonではmultiprocessingpool.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

おすすめ記事