Python, führt Befehlszeilen-Tools parallel aus

8

Ich benutze Python als Skriptsprache, um einige Datenverarbeitungs- und Aufruf-Befehlszeilentools für die Zahlenverarbeitung zu verwenden. Ich möchte Befehlszeilen-Tools parallel ausführen, da sie voneinander unabhängig sind. Wenn ein Befehlszeilentool beendet ist, kann ich seine Ergebnisse aus der Ausgabedatei sammeln. Also brauche ich auch einen Synchronisationsmechanismus, um meinem Haupt-Python-Programm mitzuteilen, dass eine Aufgabe beendet ist, damit das Ergebnis in mein Hauptprogramm geparst werden kann.

Momentan verwende ich os.system() , was gut für einen Thread funktioniert, aber nicht parallelisiert werden kann.

Danke!

    
Yin Zhu 04.03.2012, 11:35
quelle

2 Antworten

9

Verwenden Sie das Objekt Pool aus dem Modul multiprocessing . Sie können dann z.B. Pool.map() für die parallele Verarbeitung. Ein Beispiel wäre mein markphotos Skript (siehe unten), wo eine Funktion mehrfach parallel zu jedem Bild ein Bild aufgerufen wird.

%Vor%     
Roland Smith 04.03.2012, 13:00
quelle
7

Wenn Sie Kommandozeilen-Tools als separate Prozesse ausführen möchten, verwenden Sie einfach os.system (oder besser: das subprocess -Modul), um sie asynchron zu starten. Unter Unix / linux / macos:

%Vor%

Unter Windows:

%Vor%

Um zu wissen, wann ein Befehl beendet wurde: Unter Unix könnten Sie mit wait usw. eingerichtet werden, aber wenn Sie die Befehlszeilenskripte schreiben, würde ich ihnen nur eine Nachricht in eine Datei schreiben und Überwachen Sie die Datei anhand des aufrufenden Python-Skripts.

@James Youngman schlug eine Lösung für Ihre zweite Frage vor: Synchronisation. Wenn Sie Ihre Prozesse von Python aus steuern möchten, könnten Sie sie asynchron mit Popen starten.

%Vor%

Achten Sie darauf, dass wenn Sie Popen verwenden und Ihre Prozesse viele Daten in stdout schreiben, Ihr Programm blockiert. Stellen Sie sicher, dass alle Ausgaben in eine Protokolldatei umgeleitet werden.

p1 und p2 sind Objekte, mit denen Sie Ihre Prozesse überwachen können. p1.poll() blockiert nicht, gibt jedoch None zurück, wenn der Prozess noch läuft. Es wird den Exit-Status zurückgeben, wenn es fertig ist, also können Sie überprüfen, ob es Null ist.

%Vor%

Das Obige ist nur ein Modell: Wie geschrieben, wird es nie verlassen, und es wird weiterhin die Ergebnisse der abgeschlossenen Prozesse "ernten". Aber ich vertraue dir, dass du die Idee hast.

    
alexis 04.03.2012 12:10
quelle