Lua的Pluto库具有什么线程持久性?

在 Lua 的 Pluto 库的 描述文档 中,它表示该库能够持久化函数和线程。

能够持久化任何 Lua 函数
能够持久化线程
适用于任何 Lua 总块读取器 / 块写入器
支持所有数据类型的“不变”永久对象

嗯,我想象不出如何持久化函数和线程。我能获得一些关于这个特性的解释吗?

原文链接 https://stackoverflow.com/questions/8797598

点赞
stackoverflow用户221509
stackoverflow用户221509

Pluto 可以持久化任意 Lua 函数,其中包括它的字节码和所有必需的 upvalues。可以在 这里这里 查看源代码。当反序列化时,你可以像平常一样调用这个函数。但需要注意的是,它无法持久化在 Lua 中注册的 C 函数。

同时,Pluto 也可以持久化线程,它将线程的堆栈和激活记录都进行了持久化,所以当反序列化时,你可以在原地恢复执行的堆栈。代码在 这里

2012-01-10 16:57:38
stackoverflow用户312586
stackoverflow用户312586

这个源代码相对容易理解,并且注释详尽。

这个库的功能是确定哪些部分是函数和/或线程的组成部分,然后将每个部分单独存储。

如果你跳过代码,只读注释,下面是两个相关函数的样子:

static void persistfunction(PersistInfo *pi)
{
  ...
  if(cl->c.isC) {
  /* It's a C function. For now, we aren't going to allow
   * persistence of C closures, even if the "C proto" is
   * already in the permanents table. */
    lua_pushstring(pi->L, "Attempt to persist a C function");
    lua_error(pi->L);
  } else { /* It's a Lua closure. */
    /* Persist prototype */
    ...
    /* Persist upvalue values (not the upvalue objects themselves) */
    ...
    /* Persist function environment */
    ...
  }
}

static void persistthread(PersistInfo *pi)
{
  ...
  /* Persist the stack */
  ...
  /* Now, persist the CallInfo stack. */
  ...
  /* Serialize the state's other parameters, with the exception of upval stuff */
  ...
  /* Finally, record upvalues which need to be reopened */
  ...
}

因此,可以将一个函数视为原型,一组上值和环境(一个表)的组合。线程是两个“堆栈”(调用堆栈和内存堆栈,我想),状态信息(不包括上级值),基本上是当定义线程时哪些变量具有哪些值,以及上值。

您可以在PiL 27.3.3中了解更多关于上值的内容。

2012-01-10 17:09:26