没有调用Python析构函数

时间:2016-11-15 17:56:57

标签: python

任何人都知道如何让我的析构函数被称为对象破坏?

def __del__(self):
    os.unlink(self.pidfile)

场景:有一个运行Process的守护进程。守护进程获取SIGTERM,并立即向进程发送SIGTERM。进程在没有调用__del__的情况下停止执行。

1 个答案:

答案 0 :(得分:2)

正如评论中所述,为对象定义__exit__方法并使用the with statement是“破坏”对象的首选方法。它更明确,更可预测。

但是,如果收到SIGTERM,即使使用with语句也不能保证对象的干净销毁。为了在收到信号时做某事,你必须添加一个信号处理程序。

import signal
import sys

def handle_signal(signum, frame):
    print('Got signal')
    #  Do some cleanup
    sys.exit(signum)  # Maybe ???

signal.signal(signal.SIGTERM, handle_signal)

此时,您可能会考虑在信号处理程序中调用del your_object,但如果程序中仍有对该对象的引用,则无法保证调用__del__方法(请参阅__del__)的文档

因此,如果您依靠SIGTERM来关闭Python程序,那么我认为不要期望事情能够绝对顺利和可预测。