【发布时间】:2016-06-24 14:17:27
【问题描述】:
我在 lua 中有一个分类器模型来预测图像中人的性别,我需要从 C++ 中调用它。我正在使用 Lua C API。
我让它用于单个预测,我的意思是,在 C++ 中我调用 dofile("script.lua") 并从磁盘加载模型,然后我调用 predict ("image1.jpg") 我得到了结果。到目前为止一切顺利。
问题
问题是我需要能够使用线程(同时多个)调用 predict 函数,因为 predict 需要一段时间才能返回。 模型很大,所以我需要以某种方式加载它一次并像单例一样使用它。
我怎样才能实现这样的事情?还是不可能/不可行?到目前为止,我已经尝试过,但都没有奏效:
- 拥有一个model.lua 文件,其中只有模型作为单例,script.lua 将获得模型的一个实例并在第一时间加载它。然后在 C++ 中,每次我需要进行预测时,我都会有一个新的 lua_State 和 dofile("script.lua") 。我试过了,但每次都在加载模型。
- 在 C++ 中有一个静态对象 lua_State,并且 model.lua 始终在内存中,这会将模型返回到 C++(作为表)。然后将其发送到 lua 到 script.lua,如:predict(model, "image1.jpg")。
- 和上一个类似,但是不是将模型返回给C++再传回lua,而是返回一个回调函数给C++,传回lua并用它来获取模型。示例:model.lua 有一个返回模型的 getModel() 函数。我会将 getModel() 返回到 C++ 并将其发送到 script.lua,例如:predict(getModel, "image1.jpg")。然后 predict 函数会调用 getModel() 来获得模型。
更新
感谢您的反馈。一旦无法实现我需要的东西,我就放弃了使用 C API 在 Lua 和 C++ 之间进行通信的想法。
相反,我使用 Lua 运行服务器 - 使用 luasched ,并且每次我必须进行预测时,我都会从 C++ 创建到 Lua 套接字的新连接。
问候, 塞尔吉奥
【问题讨论】:
-
加载模型,然后用
lua_newthread创建线程实例来运行predict实例? -
Lua 仅设计用于单线程。不过,您可以拥有多个单独的 Lua VM。或者你可以让 Lua 代码将几个图像传递给 C++,然后 C++ 启动一堆线程,对图像进行分类,停止它们并将结果返回给 Lua。
-
@kfsone Lua 线程不是 Sergio 所说的线程。
标签: c++ multithreading lua singleton