当前位置: 首页 > 面试题库 >

为什么在Python的线程内调用sys.exit()时不退出?

锺离德庸
2023-03-14
问题内容

这可能是一个愚蠢的问题,但是我正在测试我对Python的一些假设,并对为什么以下代码段在线程中调用时不退出而在主线程中调用时退出而感到困惑。

import sys, time
from threading import Thread

def testexit():
    time.sleep(5)
    sys.exit()
    print "post thread exit"

t = Thread(target = testexit)
t.start()
t.join()
print "pre main exit, post thread exit"
sys.exit()
print "post main exit"

sys.exit()的文档指出,该调用应从Python退出。从该程序的输出中可以看到,“ post thread
exit”从不打印,但是即使在线程调用退出之后,主html" target="_blank">线程仍继续运行。

是否为每个线程创建了一个单独的解释器实例,并且对exit()的调用只是退出了该单独的实例?如果是这样,线程实现如何管理对共享资源的访问?如果我确实想从线程中退出程序(不是我真正想要的,但据我所知)怎么办?


问题答案:

sys.exit()和一样引发SystemExit异常thread.exit()。因此,当sys.exit()在该线程内引发该异常时,它的作用与调用相同thread.exit(),这就是为什么只有该线程退出的原因。



 类似资料:
  • 来自文档:http://docs.python.org/2/library/thread 让我们在这里只讨论非守护进程线程。因为第一个引号没有特别提到非守护进程线程,所以我假设,如果主线程退出,即使是非守护进程线程也应该被杀死。然而,第二句引文却表明了另一种情况。事实上,当主线程退出时,非守护进程线程确实不会被杀死。那么,这里的第一个引用有什么意义呢?

  • 问题内容: 我真的对python中的sys.exit()感到困惑。在python文档中,它说“从Python退出”;这是否意味着在python程序中被调用时,进程将退出?如果是这样,下面的代码将显示不同的结果: 在linux中启动该程序,结果不是python文档所说的预期结果,但仍然可以在系统中运行,那么,真正的作用是什么? 问题答案: 根据文件提出: 通过提高SystemExit(status)

  • 我想优雅地关闭一个线程。然而,一旦关闭被启动,线程应该在结束通常的操作后执行一些关闭操作。 两个线程都使用Hibernate和/或等待,并处理中断异常,它们还在一个循环中处理任务,只需要几毫秒。所以我期望while循环结束,因为Thread.currentThread()。isInterrupted()变为“true”。 问题是,对于我的代码,有时我会得到日志“SHUTDOWN”,有时不会。此外,

  • 问题内容: 从python docs : 不能保证在解释器退出时为仍然存在的对象调用方法。 为什么不?如果做出此保证会出现什么问题? 问题答案: 我不相信以前的答案在这里。 首先请注意,给出的示例 不会 阻止在退出过程中调用方法。实际上,当前的CPython 将 调用给定的方法,在Python 2.7中两次,在Python 3.4中一次。因此,这不能成为显示为什么不做出保证的“杀手example”

  • 第一个线程组-Wisebuy 1-1在2019-04-30 15:46:11,559开始 我将上升周期设置为1秒,为什么线程组-Wisebuy 1-5891在2019-04-30 15:46:15,541开始? 我将持续时间设置为2秒,为什么线程组-Wisebuy 1-7239在2019-04-30 15:46:18,767停止?

  • 当我运行以下代码时, 抛出。但是,当我在另一个线程中设置Promission的值时, 一切正常。根据我对的理解,调用不应该抛出异常,除非promise没有共享状态(即它已从其中移动)或已经为其赋值,即使这样,它也会抛出,而不是。由于不存在数据竞争或任何类似的情况,因此无论我是从创建promise的线程还是在另一个线程中调用都不重要。是不是我漏了什么? 我使用g++和clang都尝试了这一点,结果是