Python 的 object 没有如期通过__del__释放资源怎么办?

查看 103|回复 5
作者:nowheremanx   
比如有一个 class Task ,创建的时候会生产不少本地临时文件,整个生命周期都会用这个文件。然而 Task 没有用之后,或者程序崩溃的时候,就应该合理地销毁这些临时文件。
按理说每次 run 函数执行完,task 就没有在 context 里了,应该要被 GC 销毁,销毁的时候顺带执行资源释放。然而实际运行中,临时资源没有被释放,或者马上释放。往往是要等到整个程序结束后才开始释放。很显然,__del__没有马上被执行。
如果把 main 放到新的子进程里跑,临时文件就更不可控了。 用“destructor”来释放资源的原因是,我无法保证使用者会记得主动去 call 释放的函数。 有没有大神来答疑解惑一下,这种资源释放如何解决。
网上很多讨论,似乎也没有办法?就算是用 weakref ,也没有解决问题: https://docs.python.org/3.6/library/weakref.html#comparing-finalizers-with-del-methods
```
class Task:
def __init__(self):
self._resource = create_local_files()

def __del__(self):
self._resource.cleanup()
def run():
task = Task()
....

def main():
while True:
try:
run()
except:
pass
time.sleep(60)
```

task, def, 释放, self

t133   
使用 with tempfile 这种试试?
aijam   
+1 用 with
ysc3839   
gc 语言就是不确定释放时机的,因此不能用 C++的 RAII 这种写法,只能用语言提供的 with 等机制。
vituralfuture   
GC 是无法确定时机的,不一定是立刻释放,往往是内存占用达到阈值了或者满足其他条件了才会开始 GC
参考 https://docs.python.org/3/library/gc.html ,可以看看 python 提供的 GC 接口,可以调试 GC ,也可以立刻调用 GC
另外还可以把清理资源这些操作放到 run 函数末尾
BBCCBB   
使用者必须得保证正确释放, 不然就没法完了. 文件, io 流都是这样的..
直接用 with/try finally.
您需要登录后才可以回帖 登录 | 立即注册

返回顶部