使用模塊 atexit 當程序關閉時,執行回調函數。
註冊回調函數
使用函數 register() 註冊回調函數。
執行:
程序最後執行了回調函數 f()。
回調函數還可以註冊多次並接受參數,例如可以清理數據庫連接,處理臨時文件等等。每個回調函數執行特定的清理操作。
執行:
可以看出,回調函數按照相反的順序執行。這樣可以按照模塊導入的反向順序清理數據,減少相互依賴的衝突。
裝飾器語法
回調函數如果不需要接收參數,使用裝飾器語法更簡單,這樣會清理一些全局或者模塊級的資源。
執行:
取消回調函數
可以使用函數 unregister() 刪除回調函數。
執行:
使用 unregister() 取消了回調函數的執行。當使用 unregister() 時,如果函數之前沒有被註冊過,是不會觸發錯誤的。
回調函數沒有調用的情況
如果註冊的回調函數沒有調用,可能是如下原因:
- 進程收到了停止執行的某個信號
- 使用 os._exit() 退出了程序
- 解釋器發生了嚴重錯誤
執行:
上例中,使用 os._exit(0) 退出了程序,not_called() 函數不會調用。為了不干擾回調函數的執行,你可以調用 sys.exit() 函數。
處理異常
當在註冊的回調函數拋出異常時,最後的異常會顯示在控制檯。
執行:
通常,最好將異常在回調函數處理了,並記錄日誌。
閱讀更多 趣喜歡編程 的文章