2017-04-16 3 views
0

問題へのアクセス:複数のプロセッサから共有配列

私はnew_yの各要素のために、私はそれnew_yのような現在のyと次のy 何かしたいので、すべてのプロセス間でのy共有変数にアクセスしたいです[i] = y [i] + y [i + 1]。現在のプールワーカーが送信した配列yのインデックスを取得するにはどうすればよいですか?

import multiprocessing 

num_processes = 2 
y = multiprocessing.Array('d', 6, lock=False) 
new_y = multiprocessing.Array('d', 6, lock=False) 

def init_process(y_to_share, new_y_to_share): 
    global y, new_y 
    y = y_to_share 
    new_y = new_y_to_share 

process_pool = multiprocessing.Pool(
        num_processes, 
        initializer=init_process, 
        initargs=(y, new_y)) 

dt = 0.0001 
def sq(): 
    global y 
    global new_y 
    print new_y[0] 
    print multiprocessing.current_process() 
    #Here I want to do y at the current index and add the y value of the next index 
    #something like new_y[i] = y[i]+y[i+1] 


process_pool.map(sq, y) 
+0

を働くだろう 'multiprocessing'は、「共有」と言うとき、それは本当に各プロセスはプロキシオブジェクトに独自のコピーを取得することを意味し、バックグラウンドしようとしているプロトコルがありますそれをすべて同期させておく。私はほとんどそれが無意味であることがわかります。 – tdelaney

+0

@tdelaneyこれは問題ありませんが、私が現在作業している要素の横にあるその配列の要素にアクセスしたいと言うだけです。例えばiterableではxの値が渡され、xの隣にあるxとその値を共有配列のその値にどのようにしてアクセスできますか?基本的には、マップによって渡されるx値の位置が必要です。 – Kevin

+0

あなたは 'enumerate'でそれを行うことができますが、あなたは共有された' new_y'を全く必要としないようです。あなたのマップは 'pool.map(sq、(y [i:i + 2])iの範囲(len(y)-1))'になります。 – tdelaney

答えて

1

私は問題を完全に誤解されてもよいが、あなたはそれはあなたが望む隣接するデータを持っているように、あなたは親プロセスに反復されているものを変更することでこれに対処可能性があるため、答えることを躊躇です。

import multiprocessing 

def worker(yvals): 
    return yvals[0] + yvals[1] 

if __name__ == "__main__": 
    y_list = list(range(6)) 
    pool = multiprocessing.Pool() 
    new_y = list(pool.map(worker, 
     (y_list[i:i+2] for i in range(len(y_list)-1)))) 
    pool.close() 
    print(new_y) 

プールで起動すると、親アドレス空間のコピーオンライトビューが表示され、リストを読むことができます。私はWindowsではこの場合何が起きるのかは分かりませんが、親環境を漬けて子供を初期化しようとします。なぜ誰かがWindows上でこのモジュールを使用するのか疑問に思っています。 - しかし、LinuxとOSXのために、少なくとも、これは

import multiprocessing 

def worker(y_index): 
    return y_list[y_index] + y_list[y_index+1] 

if __name__ == "__main__": 
    y_list = list(range(6)) 
    pool = multiprocessing.Pool() 
    new_y = list(pool.map(worker, range(len(y_list)-1))) 
    print(new_y) 
関連する問題