有人知道如何让我的析构函数在对象销毁时被调用吗?
def __del__(self):
os.unlink(self.pidfile)
场景:有一个运行进程的守护进程。 Daemon 得到一个 SIGTERM,并立即发送一个 SIGTERM 给 Process。进程在未调用 __del__
的情况下停止执行。
最佳答案
如评论中所述,为您的对象定义一个 __exit__
方法并使用 the with statement是“破坏”对象的首选方式。它更加明确和可预测。
但是,即使使用 with
语句也不能保证在收到 SIGTERM 时完全销毁您的对象。为了在收到信号时执行某些操作,您必须添加信号处理程序。
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 程序,那么不要指望事情会绝对顺利和可预测地进行。
关于未调用 Python 析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40616594/