装饰器 · atexit.register

0. 一句话定位

维度 内容
作用对象 函数
使用场景 生命周期
来源 标准库 atexit
语法形式 @atexit.register

1. 做什么

将被装饰函数加入退出钩子队列;解释器正常终止时按后进先出顺序调用,用于 flush 日志、关闭连接、删除临时文件等清理。

2. 重点参数

参数 类型 默认值 作用 配置建议
无参装饰器 被装饰函数应无必需参数

等价 API:atexit.register(func, *args, **kwargs) 可传参;装饰器形式仅适用于无参函数。

3. 最小可运行示例

1
2
3
4
5
6
7
8
9
10
11
import atexit

@atexit.register
def exit_handler():
print("退出程序,执行清理。")

def main():
print("main 运行中")

if __name__ == "__main__":
main()
1
2
main 运行中
退出程序,执行清理。

4. 常见变体

1
2
3
4
5
6
import atexit

def cleanup(path):
print(f"删除 {path}")

atexit.register(cleanup, "/tmp/foo.tmp")

5. 适用 / 不适用

适用

  • 进程结束前释放资源(文件句柄、DB 连接)
  • 脚本级一次性清理

不适用

  • os._exit()SIGKILL不会触发 atexit
  • 需要捕获所有异常并保证清理 → 用 try/finally 或上下文管理器
  • 多线程下仅主线程退出时执行;子线程异常退出不保证调用

6. 易踩坑

  • 装饰的清理函数若抛异常,会打印 traceback,可能影响退出流程
  • 注册顺序:后注册先执行
  • 非正常退出(被 kill)不会运行

7. 参考

-------------本文结束感谢您的阅读-------------