为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

皈依舞 2019-11-28 13:56:28
这可能是一个愚蠢的问题,但是我正在测试我对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()的作用相同,这就是为什么仅线程退出的原因。


查看完整回答
反对 回复 2019-11-28
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

如果我确实想从线程中退出程序怎么办?


除了Deestan描述的方法之外,您还可以调用os._exit(注意下划线)。使用之前,请确保你明白,它没有清理(如呼叫__del__或类似)。


查看完整回答
反对 回复 2019-11-28
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

如果我确实想从线程中退出程序(不是我真正想要的,但据我所知)怎么办?


至少在Linux上,您可以执行以下操作:


os.kill(os.getpid(), signal.SIGINT)

这会将SIGINT发送到主线程,在此可以将其作为KeyboardInterrupt处理。


顺便说一句:在Windows上,您只能发送


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 2145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号