8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

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
渡せました。

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

8
12
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?