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 |
下面是程序運行的結果,可以看到回調函數執行的順序與它們被注冊的順序剛才相反。