模塊簡介:
從模塊的名字也可以看出來,atexit模塊主要的作用就是在程序即將結束之前執行的代碼,atexit模塊使用register函數用於註冊程序退出時的回調函數,然後在回調函數中做一些資源清理的操作
注意:
1,如果程序是非正常crash,或通過os._exit()退出,註冊的回調函數將不會被調用。
2,也可以通過sys.exitfunc來註冊回調,但通過它只能註冊一個回調,而且還不支持參數。
3,建議使用atexit來註冊回調函數。
不過請特別注意:
1,不要在程序中同時使用這兩種方式,否則通過atexit註冊的回調可能不會被正常調用。
通過查閱atexit的源碼,原來它內部是通過sys.exitfunc來實現的,它先把註冊的回調函數放到一個列表中,當程序退出時,按先進後出的順序調用註冊的回調。如果回調函數在執行過程中拋出了異常,atexit會打印異常的文字信息,並繼續執行下一下回調,直到所有的回調都執行完畢,它會重新拋出最後接收到的異常。
2,如果使用的Python版本是2.6及以後的版本,還可以用裝飾器的語法來註冊回調函數。
3,如果註冊順序是A,B,C,那麼最後調用的順序是相反的,C,B,A
該模塊主要有如下兩個函數
atexit.register(func, *args, **kargs) 註冊函數
atexit.unregister(func) 取消註冊函數
下面簡單看一下這個模塊的用法:
- import atexit
- def atexitFunc_1():
- print('I am atexitFunc_1')
- def atexitFunc_2(name, age):
- print('I am atexitFunc_2, %s is %d years old' % (name, age))
- print('I am the first output')
- atexit.register(atexitFunc_1)
- atexit.register(atexitFunc_2, 'Katherine', 20)
- #也可以使用裝飾器語法
- @atexit.register
- def atexitFunc_3():
- print('I am atexitFunc_3')
程序的輸出爲:(可見調用順序與註冊順序是相反的)
注意:在IDLE裏面atexit的輸出是不會顯示的,需要在cmd窗口裏面纔有顯示
- I am the first output
- I am atexitFunc_3
- I am atexitFunc_2, Katherine is 20 years old
- I am atexitFunc_1