這可能是一個愚蠢的問題,但是我正在測試我對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
提交
取消