atexit模塊很簡(jiǎn)單,只定義了一個(gè)register函數(shù)用于注冊(cè)程序退出時(shí)的回調(diào)函數(shù),我們可以在這個(gè)回調(diào)函數(shù)中做一些資源清理的操作。
注:如果程序是非正常crash,或者通過(guò)os._exit()退出,注冊(cè)的回調(diào)函數(shù)將不會(huì)被調(diào)用。
我們也可以通過(guò)sys.exitfunc來(lái)注冊(cè)回調(diào),但通過(guò)它只能注冊(cè)一個(gè)回調(diào),而且還不支持參數(shù)。所以建議大家使用atexit來(lái)注冊(cè)回調(diào)函數(shù)。但千萬(wàn)不要在程序中同時(shí)使用這兩種方式,否則通過(guò)atexit注冊(cè)的回調(diào)可能不會(huì)被正常調(diào)用。其實(shí)通過(guò)查閱atexit的源碼,你會(huì)發(fā)現(xiàn)原來(lái)它內(nèi)部是通過(guò)sys.exitfunc來(lái)實(shí)現(xiàn)的,它先把注冊(cè)的回調(diào)函數(shù)放到一個(gè)列表中,當(dāng)程序退出的時(shí)候,按先進(jìn)后出的順序調(diào)用注冊(cè)的回調(diào)。如果回調(diào)函數(shù)在執(zhí)行過(guò)程中拋出了異常,atexit會(huì)打印異常的文字信息,并繼續(xù)執(zhí)行下一下回調(diào),直到所有的回調(diào)都執(zhí)行完畢,它會(huì)重新拋出最后接收到的異常。
如果使用的python版本是2.6,還可以用裝飾器的語(yǔ)法來(lái)注冊(cè)回調(diào)函數(shù)。
下面是一個(gè)例子,展示了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 |
下面是程序運(yùn)行的結(jié)果,可以看到回調(diào)函數(shù)執(zhí)行的順序與它們被注冊(cè)的順序剛才相反。