【问题标题】:Clone a lua state克隆一个 lua 状态
【发布时间】:2011-01-30 15:32:46
【问题描述】:

最近,我在使用 C++ 和 Lua 进行开发时遇到了很多困难。我的情况是:出于某种原因,我的 C++ 程序中可能有数千个 Lua 状态。但是这些状态在初始化之后应该是相同的。当然,我可以为每个状态执行 luaL_loadlibs() 和 lua_loadfile(),但这非常繁重(事实上,即使只是初始一个状态,我也需要相当长的时间)。所以,我想知道以下模式:保留一个单独的 Lua 状态(必须初始化的唯一状态)然后为其他 Lua 状态克隆,这可能吗?

【问题讨论】:

标签: lua state


【解决方案1】:

当我开始使用 Lua 时,和你一样,我曾经写过一个包含数千个状态的程序,有同样的问题和想法,直到我意识到我做错了:)

Lua 有协程和线程,你需要使用这些特性来做你需要的事情。一开始它们可能有点棘手,但你应该能在几天内理解它们,这将非常值得你花时间。

【讨论】:

  • 协程确实是 Lua 的一个很好的特性,但是我正在寻找的是一种在我的 C++ 程序中克隆 lua 状态的方法。因为有成千上万的 lua 脚本(每个可能由不同的人)让我在我的 C++ 程序中执行,最好将它们加载到多线程中。因为创建的每个 lua 状态都应该加载同一个库,并在加载其相应脚本之前加载另一个通用脚本,所以对 lua_open() 返回的每个 lua 状态执行 lua_loadlib() 和 lua_load() 对我来说是一个巨大的负担,所以我我直接在克隆 lua 状态下徘徊。
【解决方案2】:

很遗憾,没有。

您可以尝试 Pluto 序列化整个状态。它确实工作得很好,但在大多数情况下,它的花费与正常初始化大致相同。

【讨论】:

  • 但是 Pluto 只是一个第三方工具,你可以在 lua 脚本中使用它。我想要的是在 C++ 环境中克隆 lua-state。
  • 如果函数可以从 Lua 端访问,为什么会有问题?大概您可以查看正在注册的 C 函数,然后调用它们调用的函数来序列化状态。如果您不希望从 Lua 访问这些功能,请不要为用户注册它们。但总的来说,这听起来并不是最好的解决方案。
【解决方案3】:

看看下面的 lua API 调用,我认为这正是你所需要的。

lua_State *lua_newthread (lua_State *L);

这将创建一个新线程,将其压入堆栈,并返回一个指向代表该新线程的lua_State 的指针。此函数返回的新线程与原线程共享其全局环境,但具有独立的执行堆栈。

没有明确的函数来关闭或销毁线程。线程会像任何 Lua 对象一样进行垃圾回收。

【讨论】:

    【解决方案4】:

    我认为,鉴于仅复制状态将具有内部引用以及可能指向外部数据的指针,因此很难完全按照您的要求进行操作。需要重建这些内部引用,以便不仅仅是让多个状态指向克隆源。

    您可以在启动后将状态序列化,然后将其加载到后续状态中。如果初始化真的很昂贵,这可能是值得的。

    我认为最接近你想做的相对容易的事情是通过初始化一个状态然后分叉将状态置于不同的进程中,但是你的操作系统支持它: http://en.wikipedia.org/wiki/Fork_(operating_system)

    如果你想从 Lua 中获得一些东西,你可以尝试这样的事情: How do you construct a read-write pipe with lua?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-07
      • 2011-05-30
      • 2021-07-31
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 2020-11-01
      • 2020-10-10
      相关资源
      最近更新 更多