python atexit模塊和register函數

模塊簡介:

 

從模塊的名字也可以看出來,atexit模塊主要的作用就是在程序即將結束之前執行的代碼,atexit模塊使用register函數用於註冊程序退出時的回調函數,然後在回調函數中做一些資源清理的操作

 

注意:

1,如果程序是非正常crash,或通過os._exit()退出,註冊的回調函數將不會被調用。

2,也可以通過sys.exitfunc來註冊回調,但通過它只能註冊一個回調,而且還不支持參數。

3,建議使用atexit來註冊回調函數。

 

不過請特別注意:

1,不要在程序中同時使用這兩種方式,否則通過atexit註冊的回調可能不會被正常調用。

通過查閱atexit的源碼,原來它內部是通過sys.exitfunc來實現的,它先把註冊的回調函數放到一個列表中,當程序退出時,按先進後出的順序調用註冊的回調。如果回調函數在執行過程中拋出了異常,atexit會打印異常的文字信息,並繼續執行下一下回調,直到所有的回調都執行完畢,它會重新拋出最後接收到的異常。

2,如果使用的Python版本是2.6及以後的版本,還可以用裝飾器的語法來註冊回調函數。

3,如果註冊順序是ABC,那麼最後調用的順序是相反的,CBA

 

該模塊主要有如下兩個函數

 

atexit.register(func, *args, **kargs)       註冊函數

atexit.unregister(func)                     取消註冊函數

 

下面簡單看一下這個模塊的用法:


[python] view plain copy
 
 
  1. import atexit  
  2.   
  3. def atexitFunc_1():  
  4.     print('I am atexitFunc_1')  
  5.   
  6. def atexitFunc_2(name, age):  
  7.     print('I am atexitFunc_2, %s is %d years old' % (name, age))  
  8.       
  9. print('I am the first output')  
  10.   
  11. atexit.register(atexitFunc_1)  
  12. atexit.register(atexitFunc_2, 'Katherine'20)  
  13.   
  14. #也可以使用裝飾器語法  
  15. @atexit.register  
  16. def atexitFunc_3():  
  17.     print('I am atexitFunc_3')  

程序的輸出爲:(可見調用順序與註冊順序是相反的)

注意:在IDLE裏面atexit的輸出是不會顯示的,需要在cmd窗口裏面纔有顯示

[python] view plain copy
 
 
  1. I am the first output  
  2. I am atexitFunc_3  
  3. I am atexitFunc_2, Katherine is 20 years old  
  4. I am atexitFunc_1  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章