Вызывает исключение из рабочего потока без перехвата поведения, определенного в Python - PullRequest
0 голосов
/ 04 июля 2019

Возникло исключение из рабочего потока, чтобы иметь полный контроль над вашим скриптом / приложением.Что произойдет, если возбужденное исключение не будет перехвачено?

Как указано в документации по 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

Мои наблюдения:

  1. Приведенный выше код был выполнен 100 раз, они всегда имеют один и тот же вывод.
  2. Необработанное исключение из рабочего потока прервет рабочий поток, но не завершит весь сценарий / приложение.
  3. Вызовsys.exit из рабочего потока имеет тот же эффект, что и необработанное исключение из рабочего потока.

Исходные вопросы:

  1. Правильно ли определено поведение в документации Python, когдаподнял исключение из рабочего потока не пойман?
  2. Когда вызывается sys.exit (0) в рабочем потоке, кажется, он только завершает рабочий поток.Определяется ли это поведение также в документации по Python?

Дополнительные вопросы:

  1. Есть ли какая-либо причина, по которой python выбирает поведение, чтобы не уничтожать весь скрипт / приложение длявыше двух случаев?Это связано с глобальным шкафчиком интерпретатора?
...