マルチプロセッシングによって呼び出される関数内でnumpy ndarray関数のスコープは異なりますか? 次に例を示します。
Python のマルチプロセッシング モジュールを使用して、次のような関数を呼び出しています。
for core in range(cores):
#target could be f() or g()
proc = mp.Process(target=f, args=(core))
jobs.append(proc)
for job in jobs:
job.start()
for job in jobs:
job.join()
def f(core):
x = 0
x += random.randint(0,10)
print x
def g(core):
#Assume an array with 4 columns and n rows
local = np.copy(globalshared_array[:,core])
shuffled = np.random.permutation(local)
を呼び出すf(core)
と、x
変数はプロセスに対してローカルになります。予想どおり、別のランダムな整数を出力します。これらは 10 を超えることはなくx=0
、各プロセスでそれを示しています。あれは正しいですか?
配列のコピーを呼び出しg(core)
て並べ替えると、4 つのまったく同じように「シャッフルされた」配列が返されます。これは、作業コピーが子プロセスに対してローカルではないことを示しているようです。あれは正しいですか?もしそうなら、共有メモリ空間を使用する以外に、共有メモリ空間から埋める必要があるときに、ndarray を子プロセスに対してローカルにすることは可能ですか?
編集:
ランダムな整数を追加するように変更g(core)
すると、望ましい効果が得られるようです。配列は異なる値を示しています。permutation
列(各子プロセスにローカル)をランダムに並べ替えているという点で何かが起こっているに違いありません...アイデア?
def g(core):
#Assume an array with 4 columns and n rows
local = np.copy(globalshared_array[:,core])
local += random.randint(0,10)
編集 II:
np.random.shuffle
も同じ動作を示します。配列の内容はシャッフルされていますが、各コアで同じ値にシャッフルされています。