Python 模塊 atexit

Python 模塊 atexit

使用模塊 atexit 當程序關閉時,執行回調函數。

註冊回調函數


使用函數 register() 註冊回調函數。

Python 模塊 atexit

執行:

Python 模塊 atexit

程序最後執行了回調函數 f()。

回調函數還可以註冊多次並接受參數,例如可以清理數據庫連接,處理臨時文件等等。每個回調函數執行特定的清理操作。

Python 模塊 atexit

執行:

Python 模塊 atexit

可以看出,回調函數按照相反的順序執行。這樣可以按照模塊導入的反向順序清理數據,減少相互依賴的衝突。

裝飾器語法


回調函數如果不需要接收參數,使用裝飾器語法更簡單,這樣會清理一些全局或者模塊級的資源。

Python 模塊 atexit

執行:

Python 模塊 atexit

取消回調函數


可以使用函數 unregister() 刪除回調函數。

Python 模塊 atexit

執行:

Python 模塊 atexit

使用 unregister() 取消了回調函數的執行。當使用 unregister() 時,如果函數之前沒有被註冊過,是不會觸發錯誤的。

回調函數沒有調用的情況


如果註冊的回調函數沒有調用,可能是如下原因:

  • 進程收到了停止執行的某個信號
  • 使用 os._exit() 退出了程序
  • 解釋器發生了嚴重錯誤
Python 模塊 atexit

執行:

Python 模塊 atexit

上例中,使用 os._exit(0) 退出了程序,not_called() 函數不會調用。為了不干擾回調函數的執行,你可以調用 sys.exit() 函數。

處理異常


當在註冊的回調函數拋出異常時,最後的異常會顯示在控制檯。

Python 模塊 atexit

執行:

Python 模塊 atexit

通常,最好將異常在回調函數處理了,並記錄日誌。


分享到:


相關文章: