我有一堆实例,每个实例都有一个唯一的临时文件用于存储从内存中保存数据以便以后检索。
我希望确保在一天结束时,所有这些文件都被删除。然而,我想留出空间进行精细的控制其删除。也就是说,如果需要,可以提前删除一些文件(例如,它们太大并且不再重要)。
最佳/推荐的方法是什么?
我的想法
唯一(但至关重要)的问题是,如果在
因此,任何建议、意见、有用的链接等都是受欢迎的。
我希望确保在一天结束时,所有这些文件都被删除。然而,我想留出空间进行精细的控制其删除。也就是说,如果需要,可以提前删除一些文件(例如,它们太大并且不再重要)。
最佳/推荐的方法是什么?
我的想法
由于我们有许多文件,它们的生命周期可能会重叠,因此
try-finalize
块或with
语句不是一个可选项。此外,它几乎不允许更细粒度的控制。从我所读的内容来看,
__del__
也不是可行的选择,因为甚至不能保证它最终会运行(尽管对于哪些情况是“有风险”的并不完全清楚)。此外(如果仍然是这种情况),当__del__
运行时,库可能不可用。tempfile
库 看起来很有前途。但是,文件在关闭后就消失了,这肯定是个问题,因为我希望在它们不执行任何操作时关闭它们,以限制打开文件的数量。该库承诺,文件“将在关闭时立即被销毁(包括对象垃圾收集时的隐式关闭)”。
他们如何实现隐式关闭?例如在 C# 中,我会使用(可靠的)终结器,而
__del__
不是终结器。
atexit
库 似乎是最佳选择,它可以作为可靠的终结器代替__del__
实现安全的一次性模式。与对象终结器相比,唯一的问题是它真正运行于退出时,这相当不方便(如果对象有资格更早地被垃圾回收,怎么办?)。- 这里,问题仍然存在。该库如何确保方法始终运行?(除非发生了真正意外的情况,否则很难做任何事情)
__del__
和atexit
库的组合可能表现最佳。也就是说,在__del__
和在atexit
中注册的方法都会进行清理,而重复的清理将被禁止。如果调用了__del__
,则已注册的方法将被删除。唯一(但至关重要)的问题是,如果在
atexit
中注册了一个方法,__del__
将不会运行,因为对对象的引用将永远存在。因此,任何建议、意见、有用的链接等都是受欢迎的。