Python-Multiprocessing - verfolgt den Prozess der pool.map-Operation

8

Ich habe eine Funktion, die einige Simulationen durchführt und gibt ein Array im String-Format zurück.

Ich möchte die Simulation (die Funktion) für ausführen variierende Eingangsparameterwerte, über 10000 mögliche Eingangswerte, und schreibe die Ergebnisse in eine einzige Datei.

Ich verwende Multiprocessing, speziell die Funktion pool.map um die Simulationen parallel ablaufen zu lassen.

Da der gesamte Prozess der Simulation mehr als 10000 Mal ausgeführt wird dauert sehr lange, ich möchte wirklich den Prozess der gesamten Operation verfolgen.

Ich denke, das Problem in meinem aktuellen Code ist, dass pool.map die Funktion 10000-mal ohne Prozessverfolgung während dieser Operationen ausführt. Sobald die parallele Verarbeitung 10000 Simulationen (das können Stunden bis Tage sein) abgeschlossen ist, werde ich verfolgt, wenn 10000 Simulationsergebnisse in einer Datei gespeichert werden. Dies verfolgt nicht wirklich die Verarbeitung von pool.map.

Gibt es eine einfache Lösung für meinen Code, die eine Prozessverfolgung ermöglicht?

%Vor%     
user32147 06.02.2015, 21:57
quelle

3 Antworten

7

Wenn Sie eine iterierte Funktion map verwenden, ist es ziemlich einfach, den Fortschritt zu verfolgen.

%Vor%

Oder Sie können eine asynchrone map verwenden. Hier werde ich die Dinge etwas anders machen, nur um es zu vermischen.

%Vor%

Beachten Sie, dass ich pathos.multiprocessing anstelle von multiprocessing verwende. Es ist nur eine Abzweigung von multiprocessing , die es Ihnen ermöglicht, map functions mit mehreren Eingängen auszuführen, hat eine viel bessere Serialisierung und erlaubt Ihnen, map -Aufrufe überall auszuführen (nicht nur in __main__ ). Sie könnten auch multiprocessing verwenden, um den obigen Code zu verwenden, der Code wäre jedoch sehr unterschiedlich.

Entweder ein iteriertes oder asynchrones map ermöglicht es Ihnen, den Code zu schreiben, den Sie besser bearbeiten möchten. Übergeben Sie zum Beispiel eine eindeutige "ID" an jeden Job und sehen Sie sich an, welche zurückkommen oder ob jeder Job seine Prozess-ID zurückgibt. Es gibt viele Möglichkeiten, um Fortschritte und Prozesse zu verfolgen ... aber das oben genannte sollte Ihnen einen Anfang geben.

Sie können pathos hier erhalten: Ссылка

    
Mike McKerns 07.02.2015, 13:49
quelle
3

Es gibt keine "einfache Lösung". Bei map geht es darum, Implementierungsdetails von Ihnen zu verbergen. Und in diesem Fall wollen Sie Details. Das heißt, die Dinge werden definitionsgemäß etwas komplexer. Sie müssen das Kommunikationsparadigma ändern. Es gibt viele Möglichkeiten, dies zu tun.

Eins ist: Erstellen Sie eine Warteschlange zum Sammeln Ihrer Ergebnisse und lassen Sie Ihre Mitarbeiter Ergebnisse in diese Warteschlange schreiben. Sie können dann innerhalb eines Überwachungsthreads oder -prozesses die Warteschlange anzeigen und die Ergebnisse konsumieren, während sie eingehen. Während des Verbrauchs können Sie sie analysieren und eine Protokollausgabe generieren. Dies ist möglicherweise der allgemeinste Weg, den Fortschritt zu verfolgen: Sie können auf eingehende Ergebnisse in jeder Art und Weise reagieren, in Echtzeit.

Ein einfacherer Weg könnte darin bestehen, Ihre Worker-Funktion etwas zu modifizieren und dort Log-Ausgaben zu generieren. Durch die sorgfältige Analyse der Protokollausgabe mit externen Tools (wie grep und wc ) können Sie sehr einfache Methoden verfolgen, um den Überblick zu behalten.

    
Jan-Philip Gehrcke 06.02.2015 22:06
quelle
3

Ich denke, Sie brauchen eine Protokolldatei .

Ich würde Ihnen empfehlen, das logging -Modul zu verwenden, das Teil der Python-Standardbibliothek ist. Leider ist logging nicht multiprocessing-sicher. Sie können es also nicht sofort in Ihrer App verwenden.

Sie müssen also einen Multiprocessing-sicheren Log-Handler verwenden oder Ihren mit einer Queue implementieren oder mit dem logging -Modul sperren.

In Stackoverflow gibt es eine Menge Diskussionen darüber. Zum Beispiel: Wie sollte ich bei der Verwendung von Multiprocessing in Python protokollieren?

Wenn der Großteil der CPU-Last in der Simulationsfunktion ist und Sie keine Log-Rotation verwenden, können Sie wahrscheinlich einen einfachen Sperrmechanismus wie diesen verwenden:

%Vor%

Sie können Ihre Protokolldatei beim Ausführen "tail-f" machen. Das sollten Sie sehen:

%Vor%

Unter Windows und Linux versucht.

Hoffe, das hilft

    
Juan Fco. Roco 08.02.2015 23:16
quelle

Tags und Links