gpt4 book ai didi

python - 在 Python 中正确完成

转载 作者:行者123 更新时间:2023-12-05 02:42:00 26 4
gpt4 key购买 nike

我有一堆实例,每个实例都有一个唯一的临时文件供其使用(将数据从内存保存到磁盘并稍后检索它们)。

我想确保在一天结束时,所有这些文件都被删除。但是,我想为对它们的删除进行细粒度控制留出空间。也就是说,如果需要,可以提前删除一些文件(例如,它们太大而且不再重要)。

实现此目标的最佳/推荐方法是什么?

可能对此的想法

  • try-finalize block 或 with 语句不是一个选项,因为我们有许多文件,它们的生命周期可能相互重叠。此外,它几乎不承认更精细控制的选项。

  • 据我所读,__del__ 也不是一个可行的选项,因为它甚至不能保证它最终会运行(尽管我不完全清楚,什么是“有风险的”情况)。此外(如果情况仍然如此),这些库在 __del__ 运行时可能不可用。

  • tempfile library似乎很有前途。然而,文件在关闭后就消失了,这绝对是一个无赖,因为我希望它们被关闭(当它们不执行任何操作时)以限制打开文件的数量。

    • 库 promise 文件“将在关闭后立即销毁(包括对象被垃圾回收时的隐式关闭)”。

      他们如何实现隐式关闭?例如。在 C# 中,我会使用(可靠的)终结器,__del__ 不是。

  • atexit library似乎是最好的候选者,它可以作为可靠的终结器而不是 __del__ 来实现安全的一次性模式。与对象终结器相比,唯一的问题是它真正在退出时运行,这相当不方便(如果对象有资格更早地被垃圾收集怎么办?)。

    • 这里,问题仍然存在。图书馆如何实现方法始终运行? (除非在非常意外的情况下很难做任何事情)

在理想情况下,似乎 __del__atexit 库的组合可能表现最好。即清理在__del__和在atexit注册的方法,禁止重复清理。如果 __del__ 被调用,注册的将被删除。

唯一(但至关重要)的问题是,如果方法在 atexit 注册,__del__ 将不会运行,因为对该对象的引用永远存在。

因此,欢迎任何建议、建议、有用的链接等。

最佳答案

我建议考虑 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

运行时会输出

clean_up ('arg1', 'arg2', 'arg3')

请注意,即使没有 my_objdel 操作,clean_up 也会执行(您可以删除最后一行代码,行为不会改变). clean_up 在对 my_obj 的所有强引用消失或结束后调用(例如使用 atexit 模块)。

关于python - 在 Python 中正确完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67868287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com