2016-12-08 4 views
0

Ich möchte ein Array für den gemeinsamen Speicher verwenden. Das Problem ist, dass das Programm so strukturiert ist, dass die untergeordneten Prozesse erzeugt werden, bevor ich die Größe des gemeinsam genutzten Arrays kenne. Wenn ich eine Nachricht sende, um das Array zu erweitern, passiert nichts und wenn ich versuche, das Shared Array selbst zu senden, erhalte ich einen Fehler. Unten ist ein kleines Skript, um mein Problem zu demonstrieren.So ändern Sie die Größe eines gemeinsamen Speichers in 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 (Daten)' hat keine Auswirkungen außerhalb des Funktionsaufrufs, auch nicht im selben Prozess. – jfs

+0

Wahr, aber ich habe versucht, 'a' als globale Variable zu deklarieren, anstatt sie als Eingabeargument in den Prozessen und in' f' zu haben, aber ich kann es immer noch nicht zum Laufen bringen. – Chicony

Antwort

0

Versuch:

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 

jetzt verwenden np_shared wie jedes numpy Array. Sie sollten es global halten, wenn mehrere Prozesse es benötigen.

Verwandte Themen