habe mir jetzt das ein oder andere Tutorial und Programmbeispiel zu multiprocessing angeschaut (u.a. http://jeetworks.org/node/81 und http://jeetworks.org/node/81) komme aber nicht weiter und hoffe ihr könnt mir helfen.
Folgendes will ich tun:
Aus meinem Hauptprogramm rufe ich regelmäßig ein Unterprogramm auf (Methode), die mir Ergebnisse für das Hauptprogramm liefert. Ohne diese Ergebnisse kann das Hauptprogramm nichtweiterlaufen. Die Methode im Unterprogramm wird in einer while-Schleife bis zu 7 mal aufgerufen. Erst wenn alle max. 7 Aufrufe erfolgt sind und die Ergebnisse (=list) aus allen Aufrufen vorliegen, können diese Ergebnisse im Hauptprogramm zusammengesetzt werden und weiterverarbeitet werden. Also wird an irgendeiner Stelle ein join() eingebaut werden müssen.
Weil die Aurufe des Unterprogramms parallel bearbeitet werden können und unabhängig voneinander sind, würde ich die natürlich auch gerne parallel bearbeiten. Was ich bisher umsetzen konnte ist die Aufrufe im Unterprogramm als Threads durchzuführen. So schön, so gut, aber die Berechnung erfolgt leider weiterhin nur auf einem Prozessor und gewonnen habe ich dadurch nichts. Im Gegenteil, die Rechenzeit hat sogar zugenommen. Deshalb würde ich gerne alle Prozessoren in der Maschine nutzen, daher multiprocessing.
In einer Art Pseudocode sieht das im Moment so aus:
Code: Alles auswählen
Aus dem Hauptprogramm kommend:
while weitersuchen:
Ergebnisse_aus_allen_max_7_durchlaufen = []
for p in [1, 2, ..., 7]: # also die max. 7 Aufrufe
Ergebnis = Klasse.solve_Problem(p)
if len(Ergebnis)>0:
Ergebnis = self.tue_was(Ergebnis, Vergleichswert)
len_Ergebnis = len(Ergebnis)
if len_Ergebnis>0:
for i in range(len_Ergebnis):
Ergebnisse_aus_allen_max_7_durchlaufen.append(Ergebnis[i])
weitersuchen = False
Code: Alles auswählen
Aus dem Hauptprogramm kommend:
while weitersuchen:
for a in range(meine_max_7_Aufrufe):
Ergebnis = Berechne_in_einem separaten_Prozess_das_Ergebnis_von(Klasse.Methode(Parameter1, Parameter2, a))
warte_bis_alle_Ergebnisse_vorliegen
vereinige_alle_Ergebnisse_zu_einer_langen_Liste
len_Ergebnis = len(vereinige_alle_Ergebnisse_zu_einer_langen_Liste)
if len_Ergebnis>0:
for i in range(len_Ergebnis):
Ergebnisse_aus_allen_max_7_durchlaufen.append(Ergebnis[i])
weitersuchen = False
Meine Versuche es mit Multiprocessing umzusetzen sind gescheitert, mir wird nicht klar wir ich die Anzahl der Prozesse steuern kann und wie ich die Ergebnisse zusammenführe. Bisher werde unendlich viele Prozesse erzeugt, aber kein Ergebnis...
Würde mich freuen, wenn jemand etwas mit diesem Beispiel anfangen kann.
HeRa