Tom*_*ons 7 python garbage-collection finalizer temporary-files del
我有很多实例,每个实例都有一个唯一的临时文件供其使用(将数据从内存保存到磁盘并稍后检索它们)。
我想确保最终所有这些文件都被删除。然而,我想留出空间来对它们的删除进行细粒度的控制。也就是说,如果需要的话,某些文件可以提前删除(例如,它们太大并且不再重要)。
实现这一目标的最佳/推荐方法是什么?
可能对此有想法
块try-finalize或with语句不是一个选项,因为我们有许多文件,它们的生命周期可能会相互重叠。而且,它几乎不承认更精细控制的选择。
从我读到的内容来看,__del__这也不是一个可行的选择,因为它甚至不能保证它最终会运行(尽管我并不完全清楚什么是“有风险”的情况)。此外(如果仍然如此),__del__运行时库可能不可用。
tempfile图书馆似乎很有前途。然而,文件在关闭后就消失了,这绝对是一个遗憾,因为我希望它们被关闭(当它们不执行任何操作时)以限制打开文件的数量。
该库承诺该文件“一旦关闭(包括对象被垃圾收集时的隐式关闭)就会被销毁”。
他们如何实现隐式关闭?例如,在 C# 中,我会使用(可靠的)终结器,但事实__del__并非如此。
atexit库似乎是最好的候选者,它可以作为可靠的终结器,而不是__del__实现安全的一次性模式。与对象终结器相比,唯一的问题是它真正在退出时运行,这相当不方便(如果对象有资格更早地被垃圾收集怎么办?)。
在理想情况下,似乎__del__和atexit库的组合可能表现最好。也就是说,清理既在 at__del__又在 中注册的方法进行atexit,而禁止重复清理。如果__del__被调用,注册的将被删除。
唯一(但也很关键)的问题是,__del__如果在 处注册了方法,则该方法不会运行atexit,因为对该对象的引用永远存在。
因此,欢迎任何建议、建议、有用的链接等。
Daw*_*weo 10
我建议考虑使用weakref内置模块来完成此任务,更具体地说weakref.finalize简单的例子:
import weakref
class MyClass:
pass
def clean_up(*args):
print('clean_up', args)
my_obj = MyClass()
weakref.finalize(my_obj, clean_up, 'arg1', 'arg2', 'arg3')
del my_obj # optional
Run Code Online (Sandbox Code Playgroud)
运行时会输出
clean_up ('arg1', 'arg2', 'arg3')
Run Code Online (Sandbox Code Playgroud)
请注意,即使没有-ing ofclean_up也会执行(您可以删除最后一行代码,并且行为不会改变)。在对 my_obj 的所有强引用消失或结束后调用(如使用模块)。delmy_objclean_upatexit