我有一個班我想確保正確關閉。特別是,即使我的主進程從外部事件中死亡(例如:SIGTERM),我也希望它關閉。如何保證正確關閉
如果'異常'死亡,上下文管理器和atexit將不會被調用。所以我一直在嘗試使用信號來捕獲事件,然後運行我特定的清理代碼。
但現在我正在進入python清理不同類型的出口的雜草。例如,雖然我可以捕獲signal.SIGTERM並添加我自己的處理程序,但我不知道如何在完成時調用默認處理程序。但不是專家,我不喜歡讓我的圖書館用我自己的代碼接管適當的系統退出。
(具體細節:我使用的是擱置,如果你不關閉一個架子,將保持在鎖定和未打開的狀態 - 基本無法使用。)
上午我做這個太辛苦?我會認爲確保我可以妥善清理不應該需要深厚的專業知識。如果我真的需要捕獲信號然後接管系統退出,我可以簡單地執行我的清理代碼,並且如果唯一的其他處理程序是SIG_DFL,那麼我只是做一個sys.exit()?這聽起來很危險,但那樣可以嗎?
我當前的代碼:
def reg_sig(signum):
old_handler = signal.getsignal(signum)
def sighandler(signum, frame):
close_open_objects() # <== my custom code
if callable(old_handler):
old_handler()
else:
# What goes here?
# do_default_handler() # <- this seems ideal
# or
# sys.exit()
try:
# I'm not sure what signals might be called so I register a bunch.
signal.signal(signum, sighandler)
except Exception as err:
pass
# Register signals
for sig in [signal.SIGHUP, signal.SIGINT, signal.SIGQUIT, signal.SIGABRT,
signal.SIGKILL,signal.SIGTERM]:
reg_sig(sig)
請注意,SIGKILL(和SIGSTOP)不能被接收信號的進程捕獲。還有更多的「外部事件」無法捕捉 - 例如,從計算機中拉動電源。你在編寫什麼惡劣環境需要你嘗試捕捉所有信號? –
可能的重複:https://stackoverflow.com/questions/23468042/the-invocation-of-signal-handler-and-atexit-handler-in-python#23468485 –
@MathiasRav - OP說這是一個問題與'擱置'數據庫。 – tdelaney