15 Stimmen

Python-Thread-Exit-Code

Gibt es eine Möglichkeit zu erkennen, ob ein Thread normal oder aufgrund einer Ausnahme beendet wurde?

20voto

A. Coady Punkte 49113

Wie bereits erwähnt, könnte ein Wrapper um die Klasse Thread diesen Zustand auffangen. Hier ist ein Beispiel.

>>> from threading import Thread
>>> class MyThread(Thread):
    def run(self):
        try:
            Thread.run(self)
        except Exception as err:
            self.err = err
            pass # or raise err
        else:
            self.err = None

>>> mt = MyThread(target=divmod, args=(3, 2))
>>> mt.start()
>>> mt.join()
>>> mt.err
>>> mt = MyThread(target=divmod, args=(3, 0))
>>> mt.start()
>>> mt.join()
>>> mt.err
ZeroDivisionError('integer division or modulo by zero',)

0voto

samoz Punkte 54011

Sie könnten eine globale Variable bei Erfolg auf 0 setzen oder auf einen Wert ungleich Null, wenn es eine Ausnahme gab. Dies ist eine ziemliche Standardkonvention.

Sie müssen diese Variable jedoch mit einem Mutex oder einer Semaphore schützen. Oder Sie könnten sicherstellen, dass nur ein Thread in die Variable schreiben kann und alle anderen sie nur lesen.

1 Stimmen

0 für Erfolg mag eine ziemlich übliche Konvention sein, aber würde nicht ein boolescher succeded ein bisschen einfacher für den Fleischinterpreten sein?

0 Stimmen

Es muss nicht global sein, wenn ich Thread unterklassifiziere, ich brauche nur eine Mitgliedsvariable, um den Erfolg anzuzeigen. Ich habe mich nur gefragt, ob es eine eingebaute Möglichkeit gibt, dies zu tun, wie der Prozess-Exit-Code.

9 Stimmen

Threads und globaler Zustand. Zwei tolle Geschmäcker, die zusammen gsrat gsrat gsrat gsrat gsrat gsrat gsrat gsrat gsrat gsrat gsrat.

0voto

user9876 Punkte 10656

Lassen Sie Ihre Thread-Funktion Ausnahmen abfangen. (Sie können dies mit einer einfachen Wrapper-Funktion tun, die einfach die alte Thread-Funktion innerhalb einer try ... except o try ... except ... else Block). Dann stellt sich nur noch die Frage, wie man Informationen von einem Thread an einen anderen weitergibt, und ich nehme an, Sie wissen bereits, wie man das macht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X