假设我有一些非常大的 Python 类,可能会消耗大量内存。该类有一些方法负责在解释器退出时清理一些东西,并在 atexit 模块中注册:
import atexit
import os
class ReallyBigClass(object):
def __init__(self, cache_file):
self.cache_file = open(cache_file)
self.data = <some large chunk of data>
atexit.register(self.cleanup)
<insert other methods for manipulating self.data>
def cleanup(self):
os.remove(self.cache_file)
这个类的各种实例可能会在程序的整个生命周期中来来去去。我的问题是:
如果我说,del
我对实例的所有其他引用,使用 atexit 注册实例方法是否安全?换句话说,是否atexit.register()
以与传统绑定相同的方式增加引用计数器?如果是这样,整个类实例现在是否必须在内存中徘徊并等到退出,因为它的方法之一已向 atexit 注册,或者实例的一部分是否可以被垃圾收集?对于像这样的瞬态类实例,在退出时构建这种清理的首选方法是什么,以便可以有效地进行垃圾收集?