Возникло исключение из рабочего потока, чтобы иметь полный контроль над вашим скриптом / приложением.Что произойдет, если возбужденное исключение не будет перехвачено?
Как указано в документации по python:
Как только активность потока запущена, поток считается «живым».Он перестает быть живым, когда его метод run () завершается - либо нормально, либо путем вызова необработанного исключения.Метод is_alive ()> проверяет, является ли поток живым.
Моя интерпретация:
Неполное исключение только завершит рабочий поток, но не завершит сценарий / приложение.
Тестовый код:
def raise_exception():
raise Exception("Raise exception")
def sys_exit():
import sys
sys.exit(0)
raise_exception_thread = threading.Thread(target=raise_exception)
sys_exit_thread = threading.Thread(target=sys_exit)
raise_exception_thread.start()
sys_exit_thread.start()
import time
time.sleep(1)
print("is raise_exception_thread alive {}".format(raise_exception_thread.is_alive()))
print("is sys_exit_thread alive {}".format(sys_exit_thread.is_alive()))
Вывод вышеуказанных кодов скопирован сюда:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
self.run()
File "/usr/lib/python3.5/threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "/home/mazh/.study/cmake/python_source/Parallelism/Thread/test_thread_termination.py", line 15, in raise_exception
raise Exception("Raise exception")
Exception: Raise exception
is raise_exception_thread alive False
is sys_exit_thread alive False
Мои наблюдения:
- Приведенный выше код был выполнен 100 раз, они всегда имеют один и тот же вывод.
- Необработанное исключение из рабочего потока прервет рабочий поток, но не завершит весь сценарий / приложение.
- Вызовsys.exit из рабочего потока имеет тот же эффект, что и необработанное исключение из рабочего потока.
Исходные вопросы:
- Правильно ли определено поведение в документации Python, когдаподнял исключение из рабочего потока не пойман?
- Когда вызывается sys.exit (0) в рабочем потоке, кажется, он только завершает рабочий поток.Определяется ли это поведение также в документации по Python?
Дополнительные вопросы:
- Есть ли какая-либо причина, по которой python выбирает поведение, чтобы не уничтожать весь скрипт / приложение длявыше двух случаев?Это связано с глобальным шкафчиком интерпретатора?