multiprocessing.Pool mit einer globalen Variablen

Ich bin mit dem Pool Klasse aus-python-multiprocessing-Bibliothek ein Programm schreiben, die ausgeführt wird, auf einem HPC-cluster.

Hier ist eine Abstraktion von dem, was ich zu tun versuche:

def myFunction(x):
    # myObject is a global variable in this case
    return myFunction2(x, myObject)

def myFunction2(x,myObject):
    myObject.modify() # here I am calling some method that changes myObject
    return myObject.f(x)

poolVar = Pool()
argsArray = [ARGS ARRAY GOES HERE]
output = poolVar.map(myFunction, argsArray)

Die Funktion f(x) in a enthalten ist *.also Datei, D. H., es wird der Aufruf einer C-Funktion.

Das problem, das ich habe ist, dass der Wert der output-variable unterscheidet sich jedes mal, wenn ich aus meinem Programm (obwohl die Funktion myObject.f() ist eine deterministische Funktion). (Wenn ich nur eins haben kann, wird dann die output-variable ist gleich, jedes mal wenn ich das Programm ausführen.)

Ich habe versucht, erstellen Sie das Objekt, anstatt es zu speichern als Globale variable:

def myFunction(x):
    myObject = createObject()
    return myFunction2(x, myObject)

Jedoch in meinem Programm die Objekt-Erstellung ist teuer, und so ist es viel einfacher zu erstellen myObject einmal und dann ändern Sie es jedes mal, wenn ich rufe myFunction2(). Damit möchte ich nicht erstellen, das Objekt jedes mal.

Haben Sie irgendwelche Tipps? Ich bin sehr neu in der parallelen Programmierung, so konnte ich gehen über diese alle falsch. Ich beschloss, den Pool zu benutzen Klasse, da wollte ich mit etwas einfachem beginnen. Aber ich bin bereit, zu versuchen, einen besseren Weg, es zu tun.

  • Könnten Sie dieses Problem beheben Programm zu sein, die läuft? Das erklären der Funktionen, nachdem Sie versuchen, Sie zu benutzen wird nicht funktionieren in Python (und relevant sein könnten, zu deinem problem)
  • Ist myObject.modify() idempotent? Das ist, können Sie es nennen eine beliebige Anzahl von Zeiten, ohne zu verändern, was es tut (wie ein reset() - Funktion)? Wenn ja, ist Ihr code sollte funktionieren. Wenn nicht, wirst du Probleme haben, weil die unterschiedlichen Prozesse, wird jede änderung Ihrer eigenen Kopien des Objekts getrennt von einander, und so können Sie duplizierte Werte über Prozesse.
  • Ja, myObject.ändern Sie() ist idempotent.
InformationsquelleAutor Hugh Medal | 2013-09-13
Schreibe einen Kommentar