Код завершения потока Python - PullRequest
11 голосов
/ 12 июня 2009

Есть ли способ узнать, нормально ли завершился поток или из-за исключения?

Ответы [ 3 ]

15 голосов
/ 12 июня 2009

Как уже упоминалось, обертка вокруг класса Thread может перехватить это состояние. Вот пример.

>>> 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',)
0 голосов
/ 12 июня 2009

Ваша функция потока ловит исключения. (Это можно сделать с помощью простой функции-оболочки, которая просто вызывает старую функцию потока внутри блока try ... except или try ... except ... else). Тогда возникает вопрос: «Как передать информацию из одного потока в другой», и я думаю, вы уже знаете, как это сделать.

0 голосов
/ 12 июня 2009

Вы можете установить некоторую глобальную переменную равной 0 в случае успеха или отличной от нуля в случае исключения Это довольно стандартное соглашение.

Однако вам нужно защитить эту переменную мьютексом или семафором. Или вы можете быть уверены, что только один поток будет писать в него, а все остальные будут просто читать его.

...