Drucken in stdout in IPython parallelen Prozessen

8

Ich bin neu bei IPython und möchte die Zwischenergebnisse beim Ausführen paralleler IPython-Cluster-Funktionen auf stdout drucken. (Ich bin mir bewusst, dass dies bei mehreren Prozessen die Ausgabe beeinträchtigen kann, aber das ist gut - es ist nur zum Testen / Debuggen und die Prozesse, die ich ausführen würde, sind lang genug, dass eine solche Kollision unwahrscheinlich ist.) Dokumentation für IPython, kann jedoch kein Beispiel finden, in dem die parallelisierte Funktion druckt. Im Grunde suche ich nach einer Möglichkeit, die Druckausgabe der Unterprozesse auf das Hauptstdout umzuleiten, das IPython-Äquivalent von

%Vor%

Das Drucken innerhalb des Prozesses funktioniert nicht:

%Vor%

gibt

zurück %Vor%

Die Berechnung wird also korrekt ausgeführt, aber die print-Anweisung in der Funktion ff wird nie gedruckt, auch nicht, wenn alle Prozesse zurückgekehrt sind. Was mache ich falsch? Wie bekomme ich "Drucken" zur Arbeit?

    
user1470788 08.03.2013, 07:51
quelle

1 Antwort

9

Es ist tatsächlich mehr wie subprocess.Popen( ... , stdout=PIPE) , als Sie zu erwarten scheinen. Genau wie das Popen -Objekt ein stdout -Attribut hat, das Sie lesen können, um das stdout des Subprozesses zu sehen, Ein AsyncResult hat ein stdout -Attribut, das das von den Engines erfasste Stdout enthält. Es unterscheidet sich darin, dass AsyncResult.stdout eine Liste von Strings ist, wobei jedes Element in der Liste das Stdout einer einzelnen Engine als String ist.

Also, um anzufangen:

%Vor%

gibt

%Vor%

Wir können die AsyncResult.stdout Liste der Strings sehen:

%Vor%

Wir können das stdout des asynchronen Ergebnisses sehen:

%Vor%

was druckt:

%Vor%

Und hier ist ein Notizbuch mit alldem demonstriert.

Einige Dinge zu beachten, basierend auf Ihrer Frage:

  1. Sie müssen warten, bis das AsyncResult abgeschlossen ist, bevor die Ausgaben bereit sind ( async.get() )
  2. display_outputs() gibt nichts zurück - es druckt tatsächlich / zeigt selbst an, also macht print(async.display_outputs()) keinen Sinn.
minrk 08.03.2013, 19:54
quelle