2016-12-08 7 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 

теперь используют np_shared как вы бы любой Numpy массив. Вы должны держать его глобальным, если ему понадобятся несколько процессов.