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 实现堆排序算法代码
Jun 05 Python
Python利用pyHook实现监听用户鼠标与键盘事件
Aug 21 Python
python实现简单的计时器功能函数
Mar 14 Python
在Python的Django框架上部署ORM库的教程
Apr 20 Python
Python的Django框架中模板碎片缓存简介
Jul 24 Python
Python使用pyodbc访问数据库操作方法详解
Jul 05 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
Aug 26 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 Python
win10下python3.8的PIL库安装过程
Jun 08 Python
Python如何测试stdout输出
Aug 10 Python
python文件路径操作方法总结
Dec 21 Python
详细介绍python操作RabbitMq
Apr 12 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
laravel批量生成假数据的方法
2019/10/09 PHP
拖动一个HTML元素
2006/12/22 Javascript
项目实践之javascript技巧
2007/12/06 Javascript
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
多种方式实现js图片预览
2016/12/12 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
js实现类似iphone的网页滑屏解锁功能示例【附源码下载】
2019/06/10 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
Vue实现多页签组件
2021/01/14 Vue.js
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
python处理RSTP视频流过程解析
2020/01/11 Python
Python JSON编解码方式原理详解
2020/01/20 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
表达自我的市场:Society6
2018/08/01 全球购物
学雷锋活动总结报告
2014/06/26 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
行政申诉状范文
2015/05/20 职场文书
原告代理词范文
2015/05/25 职场文书
警示教育观后感
2015/06/17 职场文书
工作一年自我鉴定
2019/06/20 职场文书
MySQL 不等于的三种使用及区别
2021/06/03 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL