Am Mittwoch 29 Juni 2011, 21:40:40 schrieb Ulf Rompe:
Am 28.06.2011 16:25, schrieb Florian Lindner:
Siehst Du eigentlich eine Möglichkeit, wie man den Code so formulieren kann, dass ich anstelle des Thread() Objektes ein Popen() Objekt zurückgeben kann?
Ich bin zwar nicht gefragt, antworte aber einfach trotzdem:
Gut, dass Du Dich auch angesprochen fühlt, ich antworte ja der Liste und weniger den Personen. ;-) Ich habe jetzt zwei Möglichkeiten mein Problem zu lösen. Erstmal kurz zu meinem Problem. Ich schreibe eine Job/Queue-Kontrolle für recht lang laufende Jobs (numerische Berechnungen). Eine Job-Klasse soll über ihren Status (finished, running, waiting, evtl. failed) Auskunft geben. Zu dieser Statusinformation kann ich nun auf zwei Arten gelangen: - Ich nehme das Popen-Objekt und schaue, was mir poll() zurückgibt (Methode nach Ulf) - Ich benutze callbacks und setzte da meinen Status entsprechend. (Methode nach Hans-Peter) Nun frage ich mich natürlich, was die Methoden für Vor- und Nachteile haben. Mit poll() ist meine Klasse an sich erstmal zustandslos, es kann also auch nichts schiefgehen beim Setzen des Zustandes. Mit dem Callbacks wiederum habe ich die Möglichkeit noch Aktionen beim Abschluss des Jobs auszulösen (z.B. Mail verschicken). Was ist Eure Meinung dazu? Es darf - nein soll! - jeder antworten! :-D Grüße, Florian
def popen_callback(on_exit, *popen_args, **popen_kwargs): def threaded_run(on_exit, process): process.wait() on_exit() print popen_args, popen_kwargs proc = subprocess.Popen(*popen_args, **popen_kwargs) thread = threading.Thread(target=threaded_run, args=(on_exit, proc)) thread.start() return proc
Anstelle des ganzen Popen-Objektes könnte man auch lediglich die wait()-Methode an threaded_run() übergeben und so aufrufen wie on_exit auch. Damit würde man die Funktion vielleicht etwas allgemeiner halten.