これに関するレポートが無かったのでメモ書きを落としておきます。
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))
結果
この通り、通常の関数内(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))
もしかするとちゃんとした方法があるのかもしれませんが、見つけきれなかったので、より良い方法があればご報告よろしくお願い致します。