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黑魔法Descriptor描述符的实例解析
Jun 02 Python
Java多线程编程中ThreadLocal类的用法及深入
Jun 21 Python
在NumPy中创建空数组/矩阵的方法
Jun 15 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
Dec 29 Python
django框架面向对象ORM模型继承用法实例分析
Jul 29 Python
django创建简单的页面响应实例教程
Sep 06 Python
python kafka 多线程消费者&手动提交实例
Dec 21 Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 24 Python
PyQt5 显示超清高分辨率图片的方法
Apr 11 Python
详解python字符串驻留技术
May 21 Python
Python中的datetime包与time包包和模块详情
Feb 28 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图片加水印实现方法
2016/05/06 PHP
python进程与线程小结实例分析
2018/11/11 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
JavaScript实现左右下拉框动态增删示例
2017/03/09 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
Python通过poll实现异步IO的方法
2015/06/04 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
使用python绘制常用的图表
2016/08/27 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
python安装twisted的问题解析
2018/08/21 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
python两个list[]相加的实现方法
2020/09/23 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
毕业生幼师求职自荐信
2013/10/01 职场文书
大四学生思想汇报
2014/01/13 职场文书
成本会计岗位职责
2015/02/03 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js