【问题标题】:Can you dump a running Lua coroutine to a file for a later resume?您可以将正在运行的 Lua 协程转储到文件中以供以后恢复吗?
【发布时间】:2011-07-12 08:52:21
【问题描述】:

在考虑使用 Lua 协程的游戏的加载/保存机制时,出现了一个非常有趣的问题——你能将运行中的 Lua 状态完全转储到文件中吗?除了转储环境的明显解决方案之外,还出现了两个值得注意的问题——转储函数(我认为这更容易)和转储协程。

后者让我想知道,是否有可能转储正在运行的协程以供以后调用恢复。其用途非常广泛——从长远来看,它将允许对正在运行的任务进行序列化并以 Erlang 风格传递它们。

因此问题是——这可能吗?

我不是在寻找(可能很明显)“否”的答案,因为它可能在某种程度的工作中是可能的(在最坏的情况下,人们可能会尝试破解编译器)。我对它有多难感兴趣......

【问题讨论】:

    标签: serialization lua coroutine


    【解决方案1】:

    PlutoLibrary 为 Lua 提供了“重型持久性”。它可以序列化和反序列化协程。

    【讨论】:

    • 请注意,Pluto 与 LuaJIT2(以及我知道的所有其他解决方案)不兼容。
    • 我刚刚注意到这一点:code.google.com/p/corsix-th/wiki/Persistance 应该与 LuaJIT 一起使用,但它要求所有函数都使用永久名称进行注释。从好的方面来说,它允许重新加载代码。
    【解决方案2】:

    有一个实验模块lper可以保存和恢复整个Lua解释器的状态。我个人从未使用过它,因为它依赖于没有明显的 Windows 对应物的 Linux persistent memory 库。它可能会作为进一步研究的起点。

    wiki 中还有 Lua 持久化解决方案列表。

    【讨论】:

    • 可惜前者确实依赖Linux,而后者只提供表序列化的技巧:/
    • @Kornel,当然。但是维基页面,虽然可能没有正确倾斜,但确实列出了冥王星。此外,由于任何东西都可以存储在一个表中,包括协程和闭包,一个完整的表持久性解决方案必须包括那些更“有趣”的值的持久性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多