Python的轻量级崩溃恢复

时间:2009-10-31 05:00:33

标签: python

为我的程序处理轻量级崩溃恢复的最佳方法是什么?

我有一个Python程序,它运行许多测试用例,结果存储在一个用作缓存的字典中。如果我可以保存(然后恢复)添加到字典中的每个项目,我可以再次运行该程序,缓存将提供合适的崩溃恢复。

  1. 您可以假设字典中的键和值可以轻松转换为字符串,即。使用str或pickle module
  2. 我希望这是完全跨平台的 - 至少就像Python的跨平台一样
  3. 我不想简单地将每个值写入文件并在我的程序中加载它可能会在我写文件时崩溃
  4. 更新:这是一个轻量级模块,因此DBMS是不可能的。
  5. 更新:Alex是正确的,因为我实际上并不需要需要来防止崩溃,但在某些情况下我希望能够手动将其终止于可恢复状态。
  6. 更新使用
  7. 下方的标准输入添加了一个高度有限的解决方案

5 个答案:

答案 0 :(得分:2)

没有好办法防止“你的程序崩溃将检查点写入文件”,但你为什么要这么担心那个?!你的程序在那个时候做了什么ELSE BESIDES“将检查点保存到文件”,这很容易导致它崩溃?!

在Python中序列化的可移植性很难超越pickle(或cPickle),但这只是“将键和值转换为字符串”。为了保存键值对(一旦字符串化),很少有方法比仅附加到文件更安全(挑选文件,如果你的崩溃远远超出正常情况,你建议tjey是)。

如果您的环境出于任何原因(非常便宜的硬件? - )非常容易崩溃,请确保关闭文件(如果操作系统也容易崩溃,请执行fflush ;-) ,然后重新打开它以追加。这样,可能发生的最糟糕的事情是最新的附加内容将是不完整的(由于事件中间的崩溃) - 然后你只是通过解开不完整的记录来捕获引发的异常,并仅重做那些不是保存(因为它们由于崩溃而没有完成,或者因为它们已经完成但由于崩溃而没有完全保存,最终会出现相同的情况)。

如果您可以选择检查数据库引擎(而不是仅对文件执行此操作),请认真考虑!数据库引擎将保留事务日志并确保ACID属性,如果你可以依赖它,使你的应用程序端编程更容易! - )

答案 1 :(得分:1)

pickle模块支持将对象序列化为文件(并从文件加载):

http://docs.python.org/library/pickle.html

答案 2 :(得分:1)

一种可能性是创建一些较小的文件...每个文件代表您尝试保留的状态的子集,每个文件都有一个校验和或标记,表明它已完成为最后一行/基准文件(就在文件关闭之前)。

如果校验和/标签是好的,那么剩下的数据可以被认为是有效的......虽然程序必须找到所有这些文件,打开并读取所有这些文件,并使用你提供的元数据(在他们的标题或名称中?)确定哪些构成最新的内聚状态表示(或检查点),您可以从中继续处理。

如果不了解您正在使用的数据的性质,就不可能更具体。

当然,您可以使用文件,或者您可以轻松地使用DBMS系统。任何像样的DBMS(PostgreSQL,MySQL,如果你使用适当的存储后端)可以给你ACID保证和事务支持。因此,您回读的数据应始终与您在架构中放置的约束和/或您处理的事务(BEGIN,COMMIT,ROLLBACK)一致。

将序列化日期发布到DBMS的一个可能的优点是,您可以在单独的系统上托管DBMS(在同一时间不太可能遇到与测试主机相同的不稳定性)。

答案 3 :(得分:1)

Pickle / cPickle有问题。

我使用JSON模块将对象序列化。我喜欢它,因为它不仅可以在任何操作系统上运行,而且在其他编程语言中也可以正常工作;许多其他语言和平台都具有易于访问的JSON反序列化支持,这使得在不同程序中使用相同的对象变得容易。

答案 4 :(得分:0)

严格限制的解决方案

如果我不担心它在写出时崩溃而我只想允许手动终止,我可以使用标准输出来控制它。不幸的是,这只能在达到控制点时终止程序。这可以通过创建一个新线程来读取标准输入来解决。该线程可以使用全局锁来检查主线程是否在临界区内(写入文件)并在不是这种情况下终止程序。

缺点:

  • 这是相当复杂的
  • 它增加了一个额外的线程
  • 它阻止我使用其他任何标准输入