正在从工作线程引发异常,而没有捕获python

时间:2019-07-04 13:13:16

标签: python exception thread-safety undefined-behavior

应该捕获工作线程引发的异常,以完全控制您的脚本/应用程序。如果未捕获所引发的异常会怎样?

如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选择不终止行为 以上两种情况的整个脚本/应用程序?有关系吗 全球口译储物柜?

0 个答案:

没有答案