2012-03-30 3 views
1

Mit parallelpython, versuche ich meinen alten seriellen Code in parallel zu konvertieren, die sich stark auf basiert Objekte mit Methoden, die die Variablen dieses Objekts ändern. Ein gestrippt Beispiel, in dem ich die Syntax für Einfachheit auslassen:In ParallelPython kann eine Methode eines Objekts (object.func()) eine Variable eines Objekts (object.value) nicht manipulieren

class Network: 
    self.adjacency_matrix = [ ... ] 
    self.state = [ ... ] 
    self.equilibria = [ ... ] 

... 

    def populate_equilibria(self): 
     # this function takes every possible value that self.state can be in 
     # runs the boolean dynamical system 
     # and writes an integer within self.equilibria for each self.state 
     # doesn't return anything 

Ich nenne diese Methode als: Code:

j1 = jobserver.submit(net2.populate_equilibria,(),(),("numpy as num")) 

Der Job sumbitted ist, und ich weiß, dass eine lange Berechnung dauert Ort, so spekuliere ich, dass mein Code ausgeführt wird.

Das Problem ist, ich bin neu zu Parallelpython, ich hatte erwartet, dass, wenn die Methode aufgerufen wird, würde die Variable net2.equilibria entsprechend geschrieben werden, und ich würde ein überarbeitetes Objekt (net2) bekommen. So funktioniert mein Code, unabhängige Objekte mit Methoden, die auf die Variablen des Objekts einwirken.

Obwohl die Berechnung offensichtlich und zeitlich angemessen ist, bleibt die Variable net2.equilibria unverändert. Als ob PP nur die Funktion und das Objekt übernimmt, berechnet es an anderer Stelle, aber gibt das Objekt nie zurück, so dass ich mit dem alten zurückgeblieben bin.

Was vermisse ich?

Vielen Dank im Voraus.

Antwort

1

ParallelPython funktioniert nicht auf diese Weise. Wenn Sie dem Jobserver eine Funktion übergeben, erhalten Sie ein Handle, das Sie aufrufen können, um das Ergebnis der Berechnung zu erhalten. Nur so erhalten Sie das Ergebnis Ihrer Berechnung. Lokale Objekte werden nicht durch entfernte gleichzeitige Prozesse modifiziert.

Was Sie tun sollten, ist, wickeln Sie Ihre Methodenaufruf innerhalb einer Funktion, die den neuen Zustand des Objekts zurückgibt:

def populate_equilibria (obj): 
    obj.populate_equilibria() 
    return obj 

j1 = jobserver.submit(populate_equilibria,(net2,),(),("numpy as num")) 
net2 = j1() 
+0

Dank. Das war sehr umfassend. –