Python中atexit模塊的基本使用示例
atexit模塊很簡單,只定義了一個register函數(shù)用于注冊程序退出時的回調(diào)函數(shù),我們可以在這個回調(diào)函數(shù)中做一些資源清理的操作。
注:如果程序是非正常crash,或者通過os._exit()退出,注冊的回調(diào)函數(shù)將不會被調(diào)用。
我們也可以通過sys.exitfunc來注冊回調(diào),但通過它只能注冊一個回調(diào),而且還不支持參數(shù)。所以建議大家使用atexit來注冊回調(diào)函數(shù)。但千萬不要在程序中同時使用這兩種方式,否則通過atexit注冊的回調(diào)可能不會被正常調(diào)用。其實通過查閱atexit的源碼,你會發(fā)現(xiàn)原來它內(nèi)部是通過sys.exitfunc來實現(xiàn)的,它先把注冊的回調(diào)函數(shù)放到一個列表中,當程序退出的時候,按先進后出的順序調(diào)用注冊的回調(diào)。如果回調(diào)函數(shù)在執(zhí)行過程中拋出了異常,atexit會打印異常的文字信息,并繼續(xù)執(zhí)行下一下回調(diào),直到所有的回調(diào)都執(zhí)行完畢,它會重新拋出最后接收到的異常。
如果使用的python版本是2.6,還可以用裝飾器的語法來注冊回調(diào)函數(shù)。
下面是一個例子,展示了atexit模塊的使用:
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
下面是程序運行的結(jié)果,可以看到回調(diào)函數(shù)執(zhí)行的順序與它們被注冊的順序剛才相反。
相關(guān)文章
python開發(fā)實例之Python的Twisted框架中Deferred對象的詳細用法與實例
這篇文章主要介紹了python開發(fā)實例之Python的Twisted框架中Deferred對象的詳細用法與實例,需要的朋友可以參考下2020-03-03Python的內(nèi)建模塊itertools的使用解析
這篇文章主要介紹了Python的內(nèi)建模塊itertools的使用解析,itertools是python的迭代器模塊,itertools提供的工具相當高效且節(jié)省內(nèi)存,Python的內(nèi)建模塊itertools提供了非常有用的用于操作迭代對象的函數(shù),需要的朋友可以參考下2023-09-09pandas.concat實現(xiàn)DataFrame豎著拼接、橫著拼接方式
這篇文章主要介紹了pandas.concat實現(xiàn)DataFrame豎著拼接、橫著拼接方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10