这可能是一个愚蠢的问题,但是我正在测试我对Python的一些假设,并且对为什么以下代码段在线程中调用时不退出而在主线程中调用时退出而感到困惑。import sys, timefrom threading import Threaddef 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”从不打印,但是即使在线程调用退出之后,主线程仍继续运行。是否为每个线程创建了一个单独的解释器实例,并且对exit()的调用只是退出了该单独的实例?如果是这样,线程实现如何管理对共享资源的访问?如果我确实想从线程中退出程序(不是我真正想要的,但据我所知)怎么办?
3 回答

跃然一笑
TA贡献1826条经验 获得超6个赞
sys.exit()和thread.exit()都会引发SystemExit异常。因此,当sys.exit()在该线程内引发该异常时,它的作用与调用thread.exit()的作用相同,这就是为什么仅线程退出的原因。

拉丁的传说
TA贡献1789条经验 获得超8个赞
如果我确实想从线程中退出程序怎么办?
除了Deestan描述的方法之外,您还可以调用os._exit(注意下划线)。使用之前,请确保你明白,它没有清理(如呼叫__del__或类似)。

天涯尽头无女友
TA贡献1831条经验 获得超9个赞
如果我确实想从线程中退出程序(不是我真正想要的,但据我所知)怎么办?
至少在Linux上,您可以执行以下操作:
os.kill(os.getpid(), signal.SIGINT)
这会将SIGINT发送到主线程,在此可以将其作为KeyboardInterrupt处理。
顺便说一句:在Windows上,您只能发送
添加回答
举报
0/150
提交
取消