我有一个看起来像这样的课程:
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()
如果没有,你会建议什么作为解决方案?
答案 0 :(得分:2)
等到以后只是制定可靠的策略。事实上,你必须走完全相反的方向。一旦你知道应该持久的东西,你需要采取行动来坚持它。实际上,如果要使其可靠,则需要首先向磁盘写入在尝试提交更改时可能发生的从失败中恢复所需的步骤。 pseudopython:
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()
每次都会发生,并且每一步都跟着flush()
,以确保数据在下一步发生之前将其发送到磁盘。另一个重要的事情是,只有追加才会发生在恢复日志本身上。没有任何东西被覆盖,以至于日志中的数据可能会被破坏。
答案 1 :(得分:1)
为了有序清理,您可以使用sys.atexit挂钩。在那里注册一个调用close方法的函数。在退出时可能不会调用on对象的析构函数。
答案 2 :(得分:1)
对于在解释器退出时仍然存在的对象,__del__
方法将被not guaranteed调用。
即使调用__del__
,也可以调用它。特别是,它可以在它想要调用的模块被卸载之后发生。正如Keith所指出的,sys.atexit更加安全。
答案 3 :(得分:0)
没有。你从不安全。
如果操作系统想要在没有事先通知的情况下杀死你,它会。你无能为力。您的程序可以在任何指令之后随时停止运行,并且没有机会执行任何其他代码。
没有办法保护您的服务器免受杀戮信号。
如果需要,您可以捕获较少的信号并手动删除对象,强制拨打close()
。