首页 > 解决方案 > 当 Python 对象的引用计数达到零时,注册清理的最可靠方法是什么?

问题描述

我有一个与服务器通信的 Python 客户端应用程序。当客户端不再使用对象时(即引用计数达到零 - using CPython),我需要向服务器发送一条消息,以便它可以清理相应的内存。

从 Python 的数据模型页面__del__文档中,我知道当引用计数达到零时会调用提到的特殊方法,因此实现它以向服务器发送消息可能就足够了。

我想问是否有更可靠的方法,可能通过使用垃圾收集器(可能通过使用添加回调gc.callbacks)。我不确定是否所有 Python 对象都由它处理。

在不再引用对象后调用清理的最强大方法的任何帮助将不胜感激。

标签: pythongarbage-collection

解决方案


首先要知道的是,gcCPython 中的“垃圾收集”() 模块用于收集引用循环中捕获的垃圾。在大多数程序中,几乎所有的垃圾都是通过引用计数来回收的,与gc它无关。事实上,我有一些我知道不会创建循环垃圾的长期运行程序,我以gc.disable(). 他们可以在不泄漏内存的情况下运行数天 - 仅引用计数(无法禁用)是他们回收他们创建的所有重要垃圾所需要的全部。

所以,不,这里的思考gc主要是红鲱鱼。

__del__()是你拥有的最好的钩子。这就是它存在的原因:当 CPython 得知一个对象是垃圾时,给你一种方法来做某事。

这并不意味着它是防弹的,但没有什么可以。例如,如果操作系统杀死了您的程序(例如通过SIGKILLLinux),您的程序会立即结束,没有机会执行任何清理操作。

另一种方法是weakref.finalize(obj, callback, ...)注册一个回调,以便在弱引用对象obj变为垃圾时调用。这有时的好处是(默认情况下)安排atexit模块在正常的解释器关闭序列期间运行回调,即使当时对象仍然存在。查看weakref模块的

"比较终结器和__del__()方法"

有关更多信息的部分。


推荐阅读