atexit模組很簡單,只定義了一個register函式用於註冊程式退出時的回撥函式,我們可以在這個回撥函式中做一些資源清理的操作。
注:如果程式是非正常crash,或者通過os._exit()退出,註冊的回撥函式將不會被呼叫。
我們也可以通過sys.exitfunc來註冊回撥,但通過它只能註冊一個回撥,而且還不支援引數。所以建議大家使用atexit來註冊回撥函式。但千萬不要在程式中同時使用這兩種方式,否則通過atexit註冊的回撥可能不會被正常呼叫。其實通過查閱atexit的原始碼,你會發現原來它內部是通過sys.exitfunc來實現的,它先把註冊的回撥函式放到一個列表中,當程式退出的時候,按先進後出的順序呼叫註冊的回撥。如果回撥函式在執行過程中丟擲了異常,atexit會列印異常的文字資訊,並繼續執行下一下回撥,直到所有的回撥都執行完畢,它會重新丟擲最後接收到的異常。
如果使用的python版本是2.6,還可以用裝飾器的語法來註冊回撥函式。
下面是一個例子,展示了atexit模組的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import atexit def exit0(*args, **kwarg): print 'exit0' for arg in args: print ' ' * 4, arg for item in kwarg.items(): print ' ' * 4, item def exit1(): print 'exit1' raise Exception, 'exit1' def exit2(): print 'exit2' atexit.register(exit0, *[1, 2, 3], **{ "a": 1, "b": 2, }) atexit.register(exit1) atexit.register(exit2) @atexit.register def exit3(): print 'exit3' if __name__ == '__main__': pass |
下面是程式執行的結果,可以看到回撥函式執行的順序與它們被註冊的順序剛才相反。