atexit模块解析

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

注意回调函数只有正常退出的时候才会调用,如果程序是被信号杀死或者因为严重错误导致退出,或者使用os._exit()退出程序的时候,回调函数不会调用。

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

  1. atexit.register(func[,*args[,**kargs]])

注册func函数,当程序退出时将调用这个函数。func需要的参数可以先传递给register函数。

示例:计数的简单实现,从文件中获取计数值,当程序正常退出的时候自动加1。

  1. try:
  2. _count = int(open("/tmp/counter").read())
  3. exceptIOError:
  4. _count =0
  5. def incrcounter(n):
  6. global _count
  7. _count = _count + n
  8. def savecounter():
  9. open("/tmp/counter","w").write("%d"% _count)
  10. import atexit
  11. atexit.register(savecounter)

还可以给register函数传递位置参数和关键字参数。

  1. def goodbye(name, adjective):
  2. print‘Goodbye, %s, it was %s to meet you.‘%(name, adjective)
  3. import atexit
  4. atexit.register(goodbye,‘Donny‘,‘nice‘)
  5. # or:
  6. atexit.register(goodbye, adjective=‘nice‘, name=‘Donny‘)

除此之外,还可以用作修饰器函数。

  1. import atexit
  2. @atexit.register
  3. def goodbye():
  4. print"You are now leaving the Python sector."

来自为知笔记(Wiz)

时间: 2024-11-07 23:16:58

atexit模块解析的相关文章

perl核心模块解析(一)POSIX

perl核心模块解析(一)    POSIX 详细文档链接如下 源自:http://blog.csdn.net/jonathanxqs 转自:http://perldoc.perl.org/POSIX.html POSIX/?p?z?ks/, 是可移植操作系统接口(Portable Operating System Interface ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE

nginx源码分析--nginx模块解析

nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译.对于功能模块的选

perl核心模块解析(二)List::Util

perl核心模块解析(二)    List::Util 详细文档链接如下 源自:http://blog.csdn.net/jonathanxqs 转自:http://perldoc.perl.org/List/Util.html http://www.xker.com/page/e2015/06/193925.html 在Perl中有一些专门用于处理列表数据的模块,比如说List::Util模块,该模块包含在标准库中,能提供各种高效的常见列表处理工具.因其用C语言来实现,速度一般都挺快! [例0

Typescript和Node模块解析策略

一般我们在模块化编码时,总会导入其它模块,通常我们使用如下语法: import { A } from './a'; // ES6语法 import { A } from 'a'; var A = require('./a'); // commonjs规范 不论使用哪种语法,导入的文件一般有两种:内部文件(自己开发的)和外部(node_modules)中两种,其中导入内部模块称之为相对导入,导入node_modules中,称之为非相对导入,它们在语法上的区别就是导入的路径是否是相对的 接下来我们看

Python atexit模块

atexit模块介绍 作用:让注册的函数在解释器正常终止时自动执行,可以注册多个函数,所注册的函数会逆序执行(据查资料,造成逆序的原因为函数压栈造成的,先进后出) 1.正常注册 ,示例如下. def goodbye(name, adjective): print("Goodbye %s, it was %s to meet you."% (name, adjective)) def hello(): print('hello world!') def a(): print('a') i

区块链教程btcpool矿池源码分析StratumServer模块解析

兄弟连区块链教程btcpool矿池源码分析StratumServer模块解析 核心机制总结 接收的job延迟超过60秒将丢弃 如果job中prevHash与本地job中prevHash不同,即为已产生新块,job中isClean状态将置为true????* true即要求矿机立即切换job 三种情况下将向矿机下发新job:???? 收到新高度的job???? 过去一个job为新高度且为空块job,且最新job为非空块job????* 达到预定的时间间隔30秒 最近一次下发job的时间将写入文件(

兄弟连区块链教程btcpool矿池源码分析BlockMaker模块解析

btcpool矿池-BlockMaker模块解析 核心机制总结 blkmaker可以连多个bitcoind节点 blkmaker监听和接收4类消息:RAWGBT.STRATUM_JOB.SOLVED_SHARE和NMC_SOLVED_SHARE 监听RAWGBT目的为获取gbtHash/交易列表,用于构建Block,gbtHash和vtxs写入rawGbtMap_??* rawGbtMap_保存最近100条gbtHash/vtxs对 监听STRATUMJOB目的为获取jobId/gbtHash,

python argparse模块解析命令行选项简单使用

argparse模块的解析命令行选项简单使用 util.py #!/usr/bin/env python # coding=utf-8 import argparse parser = argparse.ArgumentParser(prog="myprogram ",description="a test of argparse") parser.add_argument("-a",type=int,dest="start"

利用 druid 的 sql parser 模块解析 sql 语句

druid 是阿里开源在 github 上面的数据库连接池,里面有一个专门解析 sql 语句的模块 源码位置: https://github.com/alibaba/druid SQL Parser 模块的介绍: https://github.com/alibaba/druid/wiki/SQL-Parser 相关 API: http://tool.oschina.net/apidocs/apidoc?api=druid0.26 druid 使用说明: druid 现在已经直接发布到了 mave