【问题标题】:How to run multiple instances of a lua script from C如何从 C 运行 lua 脚本的多个实例
【发布时间】:2016-01-05 03:17:06
【问题描述】:

我有以下 lua 脚本:

mydata={}
function update(val)
    mydata["x"] = val
    if (val == 10)
      -- Call C-Api(1)
    else
       --Register callback with C when free or some event happens
       register_callback(callme)
end
function callme()

end

基本上,我希望在我的 C 程序/进程中运行此脚本的两个实例,而不必为每个脚本创建新的 LUA 状态。我想从一个实例调用 val = 10 的函数 update() 并从另一个实例调用 val = 20 的函数 update() 。从第二个实例开始,它注册一个回调函数并等待被调用。

基本上,脚本文件是我想要实现的一种规则。 系统上的几个事件可以触发此规则或脚本文件。我想根据触发它的事件来处理这个规则。可能有多个事件触发此脚本同时运行。所以我需要让这个脚本的多个实例运行,并根据触发它的事件类型来区分。

总而言之,我希望每个调用者都有单独的 mydata 实例

我想实现这样的目标。我读到了一些地方,我们应该能够运行 lua 脚本的多个实例,而不必通过在加载脚本之前加载新环境来创建新的 lua 实例

但我无法找到确切的细节。

身体能帮忙吗?

【问题讨论】:

  • 该脚本只是创建了一个表并定义了一个函数。您不需要多次运行它。而且您不想这样做,否则第二次运行会破坏原始运行中的表。您可以从运行在 lua 状态的任何其他东西调用该函数。如果您需要两个线程同时执行此操作,那么您需要同步它们对 lua 状态的访问。 究竟你想在这里做什么?
  • 感谢您的意见。我提到的表格只是一个示例。基本上我正在尝试创建一个 lua 脚本文件。这个文件作为一个规则,意味着它规定了事情应该如何工作。在我的大系统中,会发生一些事件并触发此规则。这意味着我需要针对该事件运行此 RULE 脚本。因此可能有多个事件同时触发相同的规则脚本。所以这意味着我需要让每个触发它的事件运行这个 lua 规则脚本的多个实例。假设 MyData.["x"] = event-id
  • 如果您希望mydata 可共享,那么您需要一个实例。如果要使用相同的全局名称但不共享,请创建多个 Lua 状态。如果您不需要它可共享,那么只需将其设为本地即可。您要解决的实际问题非常不清楚。
  • 谢谢泥。但我不想共享 mydata,也不想创建多个 lua 状态。有可能做到这一点吗?为了能够在多个实例上运行相同的脚本,并且每个实例都有不同的 mydata 副本?
  • 多次调用该脚本将永远做你想做的事。如果您的意思是您希望能够多次调用update 函数,那是另一个问题。如果这就是您的意思,您是否希望在呼叫者之间共享mydata(您如何定义呼叫者)?您是否想要为每个调用者提供单独的mydata 表(同样,您如何定义调用者)?您的调用者(无论他们是什么)需要在 lua 状态下共享任何内容吗?因为如果不是,并且您想要线程调用者或任何东西,那么多个 lua 状态 您想要的。你真的需要澄清你的问题。

标签: lua luac


【解决方案1】:

虽然我仍然不确定您究竟想要实现什么,但如果您希望拥有相同函数的两个实例来保持它们使用的数据私有,您只需要创建一个闭包并返回一个匿名函数您的 C 代码将使用。

这样的事情应该可以工作:

function createenv(callme)
  local mydata={}
  return function (val) -- return anonymous function
    mydata["x"] = val
    if (val == 10)
      -- Call C-Api(1)
    else
       --Register callback with C when free or some event happens
       register_callback(callme)
    end
  end
end

现在您可以在您的(C 或 Lua)代码的一部分中执行以下操作:

local update = createenv(function() --[[do whatever]] end)
update(10)

然后在另一部分你可以这样做:

local update = createenv(function() --[[do something else]] end)
update(20)

他们之间应该没有任何共同点。请注意,它们仍然共享相同的 Lua 状态,但它们的 mydata 实例将彼此独立。

【讨论】:

  • 感谢保罗的回答。这就是我要找的。但我还需要一件事。我想在闭包中有多个匿名函数。可能吗。意思是我想在 createenv() 中有类似的 function1 和 function2 吗?允许吗?
  • @PK,当然;如果您愿意,您可以返回多个函数:return function() --[[func1]] end, function() --[[func2]] end。您也可以传递多个函数以在环境中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 2015-10-31
  • 2016-06-19
  • 2012-12-21
  • 2021-07-01
相关资源
最近更新 更多