1

我有一个看起来像这样的类:

class A:
    def __init__(self, filename, sources):
        # gather info from file
        # info is updated during lifetime of the object

    def close(self):
        # save info back to file

现在,这是在一个服务器程序中,所以它可能会在没有事先通知的情况下被信号关闭。如果可能的话,定义它以确保类保存它的信息是否安全?

def __del__(self):
    self.close()

如果没有,您会建议什么作为解决方案?

4

4 回答 4

2

等到以后才不是让事情变得可靠的策略。事实上,你必须走完全相反的方向。一旦你知道应该持久化的东西,你就需要采取行动来持久化它。事实上,如果您想让它变得可靠,您需要首先将从尝试提交更改时可能发生的故障中恢复所需的步骤写入磁盘。伪蟒:

class A:
    def __init__(self, filename, sources):
        self.recover()
        # gather info from file
        # info is updated during lifetime of the object

    def update_info(self, info):
        # append 'info' to recovery_log
        # recovery_log.flush()
        # write 'info' to file
        # file.flush()
        # append 'info-SUCCESS' to recover_log
        # recovery_log.flush()

    def recover(self):
        # open recovery_log
        # skip to last 'info-SUCCESS'
        # read 'info' from recover_log
        # write 'info' to file
        # file.flush()
        # append 'info-SUCCESS' to recover_log
        # recovery_log.flush()

重要的是recover()每次都会发生这种情况,并且每个步骤后面都有 aflush()以确保数据在下一步发生之前将其输出到磁盘。另一个重要的事情是,恢复日志本身只会发生附加。不会以任何方式覆盖日志中的数据,以免损坏日志中的数据。

于 2011-06-25T00:57:16.697 回答
1

不,你永远不会安全。

如果操作系统想在没有事先通知的情况下杀死你,它会的。你对此无能为力。您的程序可以在任何指令之后随时停止运行,并且没有机会执行任何附加代码。

没有办法保护您的服务器免受终止信号的影响。

如果需要,您可以捕获较小的信号并手动删除您的对象,强制调用close().

于 2011-06-24T22:36:20.110 回答
1

对于有序清理,您可以使用sys.atexit挂钩。在那里注册一个调用您的 close 方法的函数。on object 的析构函数可能不会在退出时调用。

于 2011-06-24T22:57:33.953 回答
1

不能保证在解释器退出时仍然存在的对象调用该__del__方法。

即使__del__被调用,也可能被调用为时已晚。特别是,它可能发生在它要调用的模块已被卸载之后。正如 Keith 所指出的,sys.atexit更安全。

于 2011-06-24T23:07:15.473 回答