Die Lösung besteht, wie andere gesagt haben, darin, mehrere Prozesse zu verwenden. Welcher Rahmen besser geeignet ist, hängt jedoch von vielen Faktoren ab. Zusätzlich zu den bereits erwähnten gibt es auch charm4py und mpi4py (ich bin der Entwickler von charm4py).
Es gibt eine effizientere Möglichkeit, das obige Beispiel zu implementieren, als die Worker-Pool-Abstraktion zu verwenden. Die Hauptschleife sendet G
in jeder der 1000 Iterationen immer wieder dieselben Parameter (einschließlich des vollständigen Diagramms ) an die Mitarbeiter. Da sich mindestens ein Mitarbeiter in einem anderen Prozess befindet, müssen die Argumente kopiert und an die anderen Prozesse gesendet werden. Dies kann je nach Größe der Objekte sehr kostspielig sein. Stattdessen ist es sinnvoll, dass Mitarbeiter den Status speichern und einfach die aktualisierten Informationen senden.
In charm4py kann dies beispielsweise folgendermaßen geschehen:
class Worker(Chare):
def __init__(self, Q, G, n):
self.G = G
...
def setinner(self, node1, node2):
self.updateGraph(node1, node2)
...
def solve(Q, G, n):
# create 2 workers, each on a different process, passing the initial state
worker_a = Chare(Worker, onPE=0, args=[Q, G, n])
worker_b = Chare(Worker, onPE=1, args=[Q, G, n])
while i < 1000:
result_a = worker_a.setinner(node1, node2, ret=True) # execute setinner on worker A
result_b = worker_b.setouter(node1, node2, ret=True) # execute setouter on worker B
inneropt, partition, x = result_a.get() # wait for result from worker A
outeropt = result_b.get() # wait for result from worker B
...
Beachten Sie, dass wir für dieses Beispiel wirklich nur einen Mitarbeiter benötigen. Die Hauptschleife könnte eine der Funktionen ausführen und den Worker die andere ausführen lassen. Aber mein Code hilft, ein paar Dinge zu veranschaulichen:
- Worker A wird in Prozess 0 ausgeführt (wie die Hauptschleife). Während
result_a.get()
das Warten auf das Ergebnis blockiert ist, führt Worker A die Berechnung im selben Prozess durch.
- Argumente werden automatisch unter Bezugnahme auf Worker A übergeben, da sie sich im selben Prozess befinden (es ist kein Kopieren erforderlich).