2016-12-08 32 views
0

共有メモリ用の配列を使用します。問題は、プログラムが共有配列のサイズを知る前に子プロセスが生成されるように構造化されていることです。配列を拡張するメッセージを送信した場合、何も起こりません。共有配列自体を送信しようとすると、エラーが発生します。以下は私の問題を示す小さなスクリプトです。Pythonで共有メモリのサイズを変更するには

import multiprocessing as mp 
import numpy as np 

def f(a,pipe): 
    while True: 
     message, data = pipe.recv() 
     if message == 'extend': 
      a = np.zeros(data) 
      print a 
     elif message == 'exit': 
      break 


if __name__ == '__main__': 

    unshared_arr = np.zeros(1) 
    a = mp.Array('d', unshared_arr) 

    p1,p2 = mp.Pipe() 

    p = mp.Process(target=f, args=(a,p2)) 
    p.start() 


    p1.send(('extend', 10)) 

    p1.send(('exit', None)) 

    p.join() 

    b = np.frombuffer(a.get_obj()) 
+0

'a = np.zeros(data)'は、同じプロセス内であっても、関数呼び出しの外では何の効果もありません。 – jfs

+0

真実ですが、 'a'をグローバル変数として宣言しようとしましたが、プロセスの入力引数と' f'の入力引数として使用するのではなく、まだ動作させることができません。 – Chicony

答えて

0

試してみてください。

unshared_Arr = mp.Array(ctypes.c_uint8,SIZE_NEEDED) #should be size 
                #and not the array itself 
np_shared = np.frombuffer(ushared_Arr.get_obj(),dtype=ctypes.c_uint8) 
np_shared.reshape(SIZE_NEEDED/2,SIZE_NEEDED/2) #or (,SIZE_NEEDED) ie. any shape 
               #you want as long as the allocated size 
               #does not change 

は今、あなたはどのnumpyの配列を同じようにnp_shared使用。複数のプロセスが必要とする場合は、グローバルにしておく必要があります。

関連する問題