【问题标题】:Saving the stack?保存堆栈?
【发布时间】:2012-11-28 08:12:54
【问题描述】:

我只是好奇,是否可以将程序的所有变量和当前状态转储到一个文件中,然后在另一台计算机上恢复它?!
假设我有一个 Python 或 Ruby 小程序,给定特定条件,它将所有当前变量和当前状态转储到一个文件中。
稍后,我可以在另一台机器上再次加载它,然后返回它。
类似于 VM 快照功能。
我在这里看到过这样的问题,但与 Java 相关,保存当前的 JVM 并在不同的 JVM 中再次运行它。大多数人都说没有这样的东西,只有 Terracotta 有一些东西,仍然不完美。 谢谢。

澄清我想要达到的目标:
给定 2 个或更多 Raspberry Pi,我试图在 Pi nº1 上运行我的软件,但是,当我需要用它做一些不同的事情时,我需要将软件移动到 Pi nº2 而不会丢失数据,只有一个小的中断时间。
等等,到无限数量的机器。

【问题讨论】:

  • 我想有人可能会对pickle 发疯,然后做一些模糊的事情,但它会非常脆弱,可能无法捕捉到所有东西。不管怎样,这都是个坏主意。
  • 酸洗整个环境在这里解决:stackoverflow.com/questions/8232798/…
  • 可以使用核心转储,Perl 就是这样使用dump。您可能想在 superuser.com 上询问如何操作,但是,正如 Perl dump 文档所说,“......这个函数现在基本上已经过时了,主要是因为很难将核心文件转换为可执行文件。”
  • 谢谢,我正在阅读关于莳萝和泡菜的文章 :)
  • 使用核心转储来避免启动时间只会提高模块的加载时间和变量的初始化。它不会提高代码的运行时间,因为它仍然依赖于解释器。此外,任何打开的文件、数据库连接等都不会被保留,因此您必须在某种空闲循环中保存并重新打开才能继续。

标签: python ruby jvm stack


【解决方案1】:

好问题。

在 Smalltalk 中,是的。

实际上,在 Smalltalk 中,转储整个程序并重新启动是 唯一 存储和共享程序的方式。没有源文件,也无法从零开始启动程序。因此,在 Smalltalk 中,您将免费获得您的功能。

Smalltalk VM 提供了一个钩子,每个对象都可以在其中注册以在重新启动后恢复其外部资源,例如重新打开文件和互联网连接。而且,例如整数数组被注册到该钩子以在转储被移动到具有不同字节序的机器时更改其值的字节序。

这可能会让我们预感到用一种设计上不支持可恢复转储的语言来实现这一目标有多么困难(或不困难)。

唉,所有其他语言都不那么活跃了。除了一些 Lisp 实现之外,我不知道有任何语言支持从内存转储中恢复。

这是一个错失的机会。

【讨论】:

  • 嗨,akuhn,我一直在阅读 Smalltalk By Example,感谢您的提示,但我不相信 Smalltalk 适合我 :) 无论如何我都会试一试。谢谢
  • +1 用于提及 Smalltalk。可惜的是,它在这件事上的传承,并没有被当代工业中使用的所谓后代所接受。如此多的可能性,如此多的浪费潜力。
【解决方案2】:

我看到 Mariano 在最近的 Esug 会议上演示了在 Pharo Smalltalk 中使用 Fuel(对象序列化)。只要不碰到未序列化的对象,就可以继续调试和运行。 Squeak smalltalk 在 Pi 上运行,如果保存图像对您来说足够好,这很简单。不过,我们仍在等待更快的 JITting VM for ARM(Google Summer of Code 计划的一部分)

【讨论】:

    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2011-06-23
    • 2020-08-17
    • 2014-07-10
    • 2020-02-17
    相关资源
    最近更新 更多