用于解决多线程方法的Lua异步解释器?

我的一般想法是,单线程应用程序(Lua解释器)将始终降低依赖它的多线程应用程序(通用C++应用程序)的性能。

为了避免这个问题,我正在考虑在解释器上采用异步方法,同时保持C++应用程序的多线程,这基本上意味着基于我的方法,Lua解释器应该以异步方式将整个脚本/文件推送到调度程序中(而不等待结果),而由精心设计的C++多线程消息系统来保持一切连续。

通常的关系是“C/C++函数<->Lua”(采用顺序方法);我想要的是“C++消息系统<->整个Lua脚本”。

我也对任何能解决这个问题并真正帮助Lua和设计为多线程的C++应用程序之间混合的方法持开放态度。

是否有一些软件可以实现这种方法?

编辑

我需要一些“用户友好”的东西,并且需要在C++/Lua API设计中直接实现这种行为。

点赞
用户2895784
用户2895784

一种选择是将通信实现为 lua 协程。通过 coroutine.yield(messagedata) 向 C++ 发送消息,然后通过 lua_resume 发送结果。(参见:lua_newthread)。你甚至可以将你的函数包装一下,提供一个更好的事件 UI。

function doThing(thing, other, data)
  return coroutine.yield("doThing", thing, other, data)
end

仍然只能在任何给定时间内运行一个线程的 lua 解释器(你必须进行锁定),但你可以同时运行多个这样的协程。

2013-11-19 17:16:20
用户1244588
用户1244588

Lua 中的并发是一个有很多解决方案的话题。这里是一个资源:

实际上,你可以让自己轻松一些,因为你实际上不需要让 Lua 本身多线程运行,这会带来许多额外的问题。

显而易见的解决方案是在一个单独的线程中运行 Lua,但只提供一个薄薄的 API,其中每个 API 调用立即分叉一个新的线程/进程,或者使用某种消息传递实现异步数据传输,甚至使用短期信号量读取/写入一些值。除非你想进行繁忙的等待,否则这种解决方案需要某种空闲循环或事件监听器...

我认为另一个仍然很容易通过新 API 实现的选项是采用 node.js 的方法:

  • 在单独的线程中运行 Lua
  • 将整个 API 设计成只接受回调函数的函数。这些回调函数会被排队,并可由你的 C++ 应用程序进行调度。
  • 你甚至可以为标准 Lua API 提供回调包装器,但不需要这样做。

举个例子:

local version;
Application.requestVersionNumber(function(val) version = val; end)

当然,这个示例非常简单,但你可以理解这个思路。

但你应该知道的一件事是,使用回调函数的方式会使脚本很快变得高度分层,如果你不小心的话。虽然这对性能来说并不是坏事,但可能会使阅读难度加大。

2013-11-20 15:54:50