任何人都知道如何让我的析构函数被称为对象破坏?
def __del__(self):
os.unlink(self.pidfile)
场景:有一个运行Process的守护进程。守护进程获取SIGTERM,并立即向进程发送SIGTERM。进程在没有调用__del__
的情况下停止执行。
答案 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程序,那么我认为不要期望事情能够绝对顺利和可预测。