1. ホーム
  2. python

[解決済み] Pythonのpool.map()関数に複数のパラメータを渡す [重複] [重複

2023-07-30 14:38:56

質問

pool.map()内で、複数のパラメータを受け取る関数を使用する方法が必要です。私の理解では、pool.map()のターゲット関数は、パラメータとして1つのイテラブルを持つことができるだけですが、同様に他のパラメータを渡すことができる方法があるでしょうか?この場合、私はターゲット関数に私のLock()とロギング情報のようないくつかの構成変数を渡す必要があります。

私はいくつかの研究を試みました、そして、私はそれを動作させるために部分的な関数を使用することができるかもしれないと思います?しかし、これらがどのように動作するか完全に理解しているわけではありません。どんな助けでも大いに感謝します! 以下は、私がやりたいことの簡単な例です。

def target(items, lock):
    for item in items:
        # Do cool stuff
        if (... some condition here ...):
            lock.acquire()
            # Write to stdout or logfile, etc.
            lock.release()

def main():
    iterable = [1, 2, 3, 4, 5]
    pool = multiprocessing.Pool()
    pool.map(target(PASS PARAMS HERE), iterable)
    pool.close()
    pool.join()

どのように解決するのですか?

あなたは functools.partial を使うことができます(お察しの通り)。

from functools import partial

def target(lock, iterable_item):
    for item in iterable_item:
        # Do cool stuff
        if (... some condition here ...):
            lock.acquire()
            # Write to stdout or logfile, etc.
            lock.release()

def main():
    iterable = [1, 2, 3, 4, 5]
    pool = multiprocessing.Pool()
    l = multiprocessing.Lock()
    func = partial(target, l)
    pool.map(func, iterable)
    pool.close()
    pool.join()

def f(a, b, c):
    print("{} {} {}".format(a, b, c))

def main():
    iterable = [1, 2, 3, 4, 5]
    pool = multiprocessing.Pool()
    a = "hi"
    b = "there"
    func = partial(f, a, b)
    pool.map(func, iterable)
    pool.close()
    pool.join()

if __name__ == "__main__":
    main()

出力します。

hi there 1
hi there 2
hi there 3
hi there 4
hi there 5