2008-12-14 8 views
13

Ich habe Probleme mit dem Python-Multiprocessing-Modul. Ich verwende die Klasse Process, um einen neuen Prozess zu erzeugen, um meinen zweiten Kern zu nutzen. Dieser zweite Prozess lädt eine Menge Daten in den RAM und wartet dann geduldig, anstatt zu konsumieren.Keine Druckausgabe von untergeordnetem Multiprocessing.Process, außer das Programm stürzt ab

Ich wollte sehen, was dieser Prozess mit dem print Befehl gedruckt, aber ich sehe nichts, das es druckt. Ich sehe nur, was der Elternprozess druckt. Jetzt macht das für mich Sinn, da sie in zwei verschiedenen Prozessen leben. Der zweite Prozess erzeugt kein eigenes Shell/Standard-Ausgabefenster, noch wird seine Ausgabe an den Elternteil gesendet. Wenn dieser Prozess abstürzt, druckt er jedoch alles, was mein Skript ihm zu drucken befahl, sowie den Stack-Trace und den Fehler.

Ich frage mich, ob es eine einfache Möglichkeit gibt, die Druckausgabe des untergeordneten Prozesses an den ersten Prozess zu senden oder eine Shell-/Standardausgabe zu erzeugen, damit ich sie debuggen kann. Ich weiß, dass ich eine multiprocessing.Queue erstellen konnte, die für die Übertragung von Ausdrucken an die Eltern bestimmt ist, so dass sie diese auf die Standardausgabe drucken können, aber ich habe keine Lust, dies zu tun, wenn eine einfachere Lösung existiert.

Antwort

23

Haben Sie versucht, stdout spülen?

import sys 
print "foo" 
sys.stdout.flush() 
+0

genial! Ja, das hat wirklich funktioniert. Was macht diese sys.stdout.flush()? Erzwingt es explizit, dass die Ausdrucke stdout sind? Danke nochmal! –

+1

Es löscht die Puffer. Stdout wird gespeichert, bis Sie einen vollen Puffer haben. Flush hört auf zu warten. Versuchen Sie, zu stderr zu drucken, um zu sehen, was es tut. Manchmal ist es ungepuffert. –

+0

@Nicholas: kein Problem :) Bei der Ausführung von Teilprozessen ist ihre Standardausgabe normalerweise gepuffert (und ihr Standardfehler ist normalerweise nicht), S.Lott erklärte, was das bedeutet. Sie können verschiedene Tricks ausprobieren, um die Pufferung zu verhindern, aber die Verwendung von sys.stdout.flush() ist einfach und funktioniert immer. – orip

Verwandte Themen