2017-02-28 12 views
0

属性として2次元numpy配列を持つオブジェクトAを作成したとします。次に、Process APIを使用して10個のスレッドを作成し、Aの行をランダムに設定しました。共有numpy配列を持つPythonマルチプロセッシング

すべてのプロセス(スレッド)間で共有されている場合はself.xかどうか、 )はただのコピーを持っていますか?

共有されていない場合、私はすべてのアップデートを失うでしょうか?

import numpy as np 
from multiprocessing import Process 

class A: 

    def __init__(): 
     self.x = np.zeros((3,4)) 

    def update(): 
     threads = [] 
     for i in range(10): 
      trd = Process(target=self.set, args=(i,)) 
     threads.append(trd) 
     trd.start() 

     for i in range(10): 
      threads[i].join() 

    def set(i): 
     self.x[i/3] = np.random.rand(1,4) 


if ___main___: 
     a = A() 
     a.update() 

答えて

0

いいえ、共有されていません。各プロセスが親プロセスのファイル記述子をコピーし、が共有されていない複数のプロセスを生成すると、オブジェクトが生成されます。

共有変数を作成するには、ctypeというオブジェクトを使用します。

ので、代わりとして配列を宣言する -

self.x = np.zeros((3,4)) 

あなたはこのArray使用してそれを宣言することができます - まだあなたがnumpyの配列に共有配列を作成したい場合は

from multiprocessing import Array 
self.x = Array('i', [0]*10) 

は、顔をしていますこの偉大なanswer

ここの注意点は、それほど簡単ではないかもしれません。競合状態を避けるために共有配列をロックする必要があります。

関連する問題