當我們的指令碼程式進入死迴圈或者卡在某個耗時操作,需要退出程式時,一般都是使用ctrl+c來殺死程序,那麼,如何在程式裡進行這個操作呢?實際上,在命令列輸入ctrl+c的原理是觸發了 sigint 訊號,所以我們需要捕捉這個訊號。
使用signal模組開捕捉訊號, 並使用sys的exit方法退出程式。
處理死迴圈
import signal
import sys
import time
defquit
(signum, frame)
: sys.exit(0)
if __name__ ==
"__main__"
:## sigint 終止程序 中斷程序
signal.signal(signal.sigint, quit)
## signal.signal(signal.sigterm, quit)
while
true
: time.sleep(
1)
處理io/耗時操作
不同於死迴圈,在單程序單執行緒的情況下,如果程式卡在某個io操作或者耗時操作,python無法捕捉到signal訊號(得處理完當前任務才可以)。
這就需要多執行緒來處理問題,當然因為gil的原因,這裡的多執行緒也只是單核多執行緒。
import time
import signal
import sys
import threading
defquit
(signum, frame)
:print
("bye!"
) sys.exit(0)
defwork()
: time.sleep(
99999
)def
main()
: work_thread = threading.thread(target=work)
work_thread.daemon =
true
work_thread.start(
) signal.signal(signal.sigint, quit)
print
("start working"
)while
true
: time.sleep(1)
if __name__ ==
"__main__"
: main(
)
ctrl c退出python多執行緒程式
多工並行處理多數需要用到多執行緒,第一次用python寫乙個任務,需要同時監控兩個狀態,就使用了下多執行緒,但測試時候ctrl c居然退不出,我以為是bug,結果看了下確實是這樣的。如果乙個python程式用了多執行緒,當子執行緒沒有結束時,用ctrl c是關閉不了主線程的,這時候就只能用kill命...
golang捕獲ctrl c退出程式
在golang當中如何捕獲ctrl c命令,讓程式有序的的退出?首先測試一段golang 捕獲sigint和sigkill c make chan os.signal,1 signal.notify c,os.interrupt,os.kill s c fmt.println got signal ...
python錯誤捕捉
python使用try except捕捉錯誤,當發現錯誤時無需從底層向上依次返回錯誤 而是直接丟擲異常。通常使用方法 try 執行語句,發生錯誤時後續語句不在執行,轉至except except 處理該型別的錯誤 except else 無錯誤發生時執行此處 finally 不管有無錯誤都會執行 錯...