Help us understand the problem. What is going on with this article?

[Python] Multiprocessing内でグローバル変数は参照できないっぽい

More than 1 year has passed since last update.

これに関するレポートが無かったのでメモ書きを落としておきます。

Pythonでは標準モジュールのMultiprocessingにより、並列計算を行うことができます。
GPUのようなハードウェア的並列計算がサポートされるわけではなく、あくまでCPU上でのマルチプロセス処理です。

並列で処理したい関数の引数に、プールした引数リストの要素がそれぞれ渡されます。

並列処理される関数内でグローバル変数を参照するようなスクリプトを書いてみると以下のようになります。

example.py
import multiprocessing as mp

a = 0

def init_global():
    global a
    a = 100

def func(proc):
    global a
    print("Inside MultiProcess: ", proc, a)
    return a

if __name__ == "__main__":

    print("Before Change", a)

    init_global()

    print("After Change", a)

    pool = mp.Pool(4)
    callback = pool.map(func, range(4))
    pool.terminate()
    pool.join()

    print(sum(callback))

結果
2017-03-14_150753.jpg
この通り、通常の関数内(init_global)では参照及び代入ができていますが、並列処理される関数内でグローバル変数が参照できていません。


どうしても並列処理関数内でグローバル変数の値を参照したい場合は呼び出し元から引数指定するしかなさそうです。
(複数の引数を渡したい場合はタプルを生成してやる必要があります)

example.py
import multiprocessing as mp

a = 0
b = 1111

def init_global():
    global a
    a = 100

def func(proc):
    print("Inside MultiProcess: ", proc[0], proc[1])
    return proc[0]

if __name__ == "__main__":

    print("Before Change", a)

    init_global()

    print("After Change", a)

    pool = mp.Pool(4)
    args = [(a,b) for i in range(4)]
    callback = pool.map(func, args)
    pool.terminate()
    pool.join()

    print(sum(callback))

結果
2017-03-14_151709.jpg
渡せました。

もしかするとちゃんとした方法があるのかもしれませんが、見つけきれなかったので、より良い方法があればご報告よろしくお願い致します。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away