Czy istnieje sposób sprawdzenia, czy wątek został zakończony normalnie, czy z powodu wyjątku?Kod zakończenia wątku Python
9
A
Odpowiedz
13
Jak wspomniano, otoki wokół klasy wątków mogą przechwycić ten stan. Oto przykład.
>>> from threading import Thread
>>> class MyThread(Thread):
def run(self):
try:
Thread.run(self)
except Exception as self.err:
pass # or raise
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',)
-1
Można ustawić niektóre zmienne globalne na 0, jeśli powodzenie, lub niezerowe, jeśli wystąpił wyjątek. To dość standardowa konwencja.
Należy jednak chronić tę zmienną za pomocą muteksu lub semafora. Możesz też upewnić się, że tylko jeden wątek kiedykolwiek napisze do niego, a wszyscy inni po prostu to przeczytają.
0
Mieć wyjątki funkcji catch wyjątków. (Możesz to zrobić za pomocą prostej funkcji zwijania, która po prostu wywołuje funkcję starego wątku wewnątrz bloku try
... except
lub . Wtedy pytanie staje się "jak przekazywać informacje z jednego wątku do drugiego" i wydaje mi się, że już wiesz, jak to zrobić.
0 Sukces może być dość standardową konwencją, ale czy "automat" nie byłby łatwiejszy w interpretacji mięsa? –
Nie musi to być globalne, jeśli mam podklasę wątku, potrzebna jest tylko zmienna składowa, która wskazywałaby na sukces. Właśnie zastanawiałem się, czy jest jakiś wbudowany sposób, aby to zrobić, jak kod wyjścia procesu. –
Wątki i stan globalny. Dwa świetne smaki tattat gsrat eogetherrrrrrrrrrrrrrrr Błąd segmentacji, rdzeń po cenach dumpingowych. – Glyph