0. 一句话定位
| 维度 | 内容 |
|---|---|
| 作用对象 | 函数 |
| 使用场景 | 生命周期 |
| 来源 | 标准库 atexit |
| 语法形式 | @atexit.register |
1. 做什么
将被装饰函数加入退出钩子队列;解释器正常终止时按后进先出顺序调用,用于 flush 日志、关闭连接、删除临时文件等清理。
2. 重点参数
| 参数 | 类型 | 默认值 | 作用 | 配置建议 |
|---|---|---|---|---|
| — | — | — | 无参装饰器 | 被装饰函数应无必需参数 |
等价 API:atexit.register(func, *args, **kwargs) 可传参;装饰器形式仅适用于无参函数。
3. 最小可运行示例
1 | import atexit |
1 | main 运行中 |
4. 常见变体
1 | import atexit |
5. 适用 / 不适用
适用
- 进程结束前释放资源(文件句柄、DB 连接)
- 脚本级一次性清理
不适用
os._exit()、SIGKILL等不会触发 atexit- 需要捕获所有异常并保证清理 → 用
try/finally或上下文管理器 - 多线程下仅主线程退出时执行;子线程异常退出不保证调用
6. 易踩坑
- 装饰的清理函数若抛异常,会打印 traceback,可能影响退出流程
- 注册顺序:后注册先执行
- 非正常退出(被 kill)不会运行