Python中atexit模块的基本使用示例


Posted in Python onJuly 08, 2015

atexit模块很简单,只定义了一个register函数用于注册程序退出时的回调函数,我们可以在这个回调函数中做一些资源清理的操作。

注:如果程序是非正常crash,或者通过os._exit()退出,注册的回调函数将不会被调用。

我们也可以通过sys.exitfunc来注册回调,但通过它只能注册一个回调,而且还不支持参数。所以建议大家使用atexit来注册回调函数。但千万不要在程序中同时使用这两种方式,否则通过atexit注册的回调可能不会被正常调用。其实通过查阅atexit的源码,你会发现原来它内部是通过sys.exitfunc来实现的,它先把注册的回调函数放到一个列表中,当程序退出的时候,按先进后出的顺序调用注册的回调。如果回调函数在执行过程中抛出了异常,atexit会打印异常的文字信息,并继续执行下一下回调,直到所有的回调都执行完毕,它会重新抛出最后接收到的异常。

如果使用的python版本是2.6,还可以用装饰器的语法来注册回调函数。

下面是一个例子,展示了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

下面是程序运行的结果,可以看到回调函数执行的顺序与它们被注册的顺序刚才相反。

Python中atexit模块的基本使用示例

Python 相关文章推荐
Python下singleton模式的实现方法
Jul 16 Python
Python中的__new__与__init__魔术方法理解笔记
Nov 08 Python
python操作字典类型的常用方法(推荐)
May 16 Python
Python Queue模块详细介绍及实例
Dec 27 Python
python验证码识别实例代码
Feb 03 Python
通过PHP与Python代码对比的语法差异详解
Jul 10 Python
安装多个版本的TensorFlow的方法步骤
Apr 21 Python
基于Python绘制美观动态圆环图、饼图
Jun 03 Python
Python基于httpx模块实现发送请求
Jul 07 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
Python基于template实现字符串替换
Nov 27 Python
教你怎么用Python操作MySql数据库
May 31 Python
python登录豆瓣并发帖的方法
Jul 08 #Python
python发送HTTP请求的方法小结
Jul 08 #Python
python友情链接检查方法
Jul 08 #Python
Python抓取百度查询结果的方法
Jul 08 #Python
Python抓取淘宝下拉框关键词的方法
Jul 08 #Python
Python根据区号生成手机号码的方法
Jul 08 #Python
Python写入CSV文件的方法
Jul 08 #Python
You might like
php 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
PHP中的self关键字详解
2019/06/23 PHP
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
2013/03/04 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
Angular 4.X开发实践中的踩坑小结
2017/07/04 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
python实现巡检系统(solaris)示例
2014/04/02 Python
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
Python3实现转换Image图片格式
2018/06/21 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
django 模型中的计算字段实例
2020/05/19 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
html5时钟实现代码
2010/10/22 HTML / CSS
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
机电专业大学生求职信
2013/10/04 职场文书
高中生毕业自我鉴定
2013/10/10 职场文书
行政部主管岗位职责
2013/12/28 职场文书
上诉答辩状范文
2015/05/22 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技