Python模組學習:atexit

發表於2015-05-21

atexit模組很簡單,只定義了一個register函式用於註冊程式退出時的回撥函式,我們可以在這個回撥函式中做一些資源清理的操作。

注:如果程式是非正常crash,或者通過os._exit()退出,註冊的回撥函式將不會被呼叫。

我們也可以通過sys.exitfunc來註冊回撥,但通過它只能註冊一個回撥,而且還不支援引數。所以建議大家使用atexit來註冊回撥函式。但千萬不要在程式中同時使用這兩種方式,否則通過atexit註冊的回撥可能不會被正常呼叫。其實通過查閱atexit的原始碼,你會發現原來它內部是通過sys.exitfunc來實現的,它先把註冊的回撥函式放到一個列表中,當程式退出的時候,按先進後出的順序呼叫註冊的回撥。如果回撥函式在執行過程中丟擲了異常,atexit會列印異常的文字資訊,並繼續執行下一下回撥,直到所有的回撥都執行完畢,它會重新丟擲最後接收到的異常。

如果使用的python版本是2.6,還可以用裝飾器的語法來註冊回撥函式。

下面是一個例子,展示了atexit模組的使用:

下面是程式執行的結果,可以看到回撥函式執行的順序與它們被註冊的順序剛才相反。

相關文章