python - 当 Python 对象的引用计数达到零时,注册清理的最可靠方法是什么?
问题描述
我有一个与服务器通信的 Python 客户端应用程序。当客户端不再使用对象时(即引用计数达到零 - using CPython
),我需要向服务器发送一条消息,以便它可以清理相应的内存。
从 Python 的数据模型页面__del__
文档中,我知道当引用计数达到零时会调用提到的特殊方法,因此实现它以向服务器发送消息可能就足够了。
我想问是否有更可靠的方法,可能通过使用垃圾收集器(可能通过使用添加回调gc.callbacks
)。我不确定是否所有 Python 对象都由它处理。
在不再引用对象后调用清理的最强大方法的任何帮助将不胜感激。
解决方案
首先要知道的是,gc
CPython 中的“垃圾收集”() 模块仅用于收集引用循环中捕获的垃圾。在大多数程序中,几乎所有的垃圾都是通过引用计数来回收的,与gc
它无关。事实上,我有一些我知道不会创建循环垃圾的长期运行程序,我以gc.disable()
. 他们可以在不泄漏内存的情况下运行数天 - 仅引用计数(无法禁用)是他们回收他们创建的所有重要垃圾所需要的全部。
所以,不,这里的思考gc
主要是红鲱鱼。
__del__()
是你拥有的最好的钩子。这就是它存在的原因:当 CPython 得知一个对象是垃圾时,给你一种方法来做某事。
这并不意味着它是防弹的,但没有什么可以。例如,如果操作系统杀死了您的程序(例如通过SIGKILL
Linux),您的程序会立即结束,没有机会执行任何清理操作。
另一种方法是weakref.finalize(obj, callback, ...)
注册一个回调,以便在弱引用对象obj
变为垃圾时调用。这有时的好处是(默认情况下)安排atexit
模块在正常的解释器关闭序列期间运行回调,即使当时对象仍然存在。查看weakref
模块的
有关更多信息的部分。
推荐阅读
- r - navbarPage Shiny 上的倍数文件输入
- angular - Angular 6 Firebase 返回重复数据
- mongodb - 构建包含字符串和正则表达式模式的 $in 数组
- ruby-on-rails - 使用委托给 getter/setter 时,Rails 无法将值大量分配给 DB
- spring - Lombok @RequiredArgsConstructor 不起作用,在 Eclipose 编译期间导致“空白最终字段可能尚未初始化”错误
- java - 为什么 JBoss 在部署之前就启动了?
- windows - 如何释放这些 .txt 文件的内存
- php - Why is written in php dependent upon an img src written in html?
- c# - C# REST 客户端 Web API GET 请求使用 api 密钥身份验证
- php - 从我的 php 代码执行查询时出现问题