在线程中从 C++ 调用 Lua

我有一个 Lua 分类模型来预测图像中人物的性别,我需要从 C++ 中调用它。我使用 Lua C API。

我已经实现了单次预测。即,在 C++ 中我调用了 dofile("script.lua") 来从磁盘加载模型,然后调用 predict("image1.jpg") 来获得结果。到这里为止一切都很好。

问题

问题是我需要能够使用线程(同时进行多个预测),因为 predict 需要花费一些时间才能返回结果。模型非常大,所以我需要像单例一样加载一次它并重复使用它。

我该如何实现这样的功能?或这不可能 / 并不可行?到目前为止,我尝试过但没有成功:

  • 在 C++ 中每次需要进行预测时都使用新的 lua_State 和 **dofile("script.lua")**,并将模型加载到一个名为 model.lua 的文件中。然后将该文件作为单例的实例传递给 script.lua。我尝试过但每次都会加载模型。
  • 在 C++ 中使用静态对象 lua_State,并将 model.lua 始终保存在内存中,随后将其作为一个表返回给 C++。然后将其发送回 Lua,例如:**predict(model, "image1.jpg")**。
  • 与前一个方案类似,但改为将回调函数返回给 C++,再将其发送回 Lua 来获取模型。例如,model.lua 有一个 getModel() 函数,将返回模型。我会将 getModel() 返回给 C++,再将其发送回 script.lua,例如:**predict(getModel, "image1.jpg")**。然后 predict 函数将调用 getModel() 来获取模型。

更新

感谢大家的反馈。由于无法实现我所需的功能,我放弃了使用 C API 在 Lua 和 C++ 之间进行通信的想法。

相反,我正在运行一个使用 luasched 的 Lua 服务器,从 C++ 中每次都创建一个新的连接到 Lua socket 进行预测。

敬礼, Sérgio

点赞
用户734069
用户734069

无法在 Lua 中实现多线程

使用原始的 Lua 无法实现您想要的通用功能,因为它是单线程系统。虽然可以创建多个独立的 lua_State 对象,可以在独立的线程上运行,但不能从两个不同的线程调用同一 lua_State 实例。

您可以尝试 Lua Lanes,这是一个面向 Lua 的线程框架。但是,它仍然需要单独的 lua_State,其主要作用是(至少在理论上)提供一种轻量级的方式来共享 lua_State 之间的数据。

或者,您可以创建数量等于您拥有的核心数的许多 _进程_。每个进程都必须独立加载模型,但是您将永远不会比您要使用的核心数更多次地加载模型。但是这种方式,每个进程都可以执行任意数量的 predict 调用。您甚至可以从 stdin 中获取文件名,这样允许某个主要进程将工作分配给单个进程。

2016-03-10 05:11:38