未调用 Python 析构函数

标签 python

有人知道如何让我的析构函数在对象销毁时被调用吗?

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/

相关文章:

python - JSON到CSV转换器-YELP数据集-python

python - MultiIndex 数据帧的平均值

python - 如何在交叉表 Pandas 中获取总计?

python - wxPython:扩展一些东西

python - 如何在 python 中将超大数与超小数相乘?

python - 无法在 redshift 中的表上写入

Python - 根据列值将数据框拆分为多个数据框并用这些值命名它们

python - 将列表中的整数与其索引相乘

python - 如果我用re.findall 怎么注册才能不分开点

python - 在 Pandas 中,为什么一个数组用 0 填充,而另一个数组填充非类型?