从C+呼叫Lua+;在线程中 我在Lua中有一个分类器模型来预测图像中的人的性别,我需要从C++调用它。我正在使用luacapi 我有一个单一的预测,我的意思是,在C++中,我调用 DOFILE(“脚本·LUA”)< /St>并且从磁盘加载模型,然后调用预测(“IMAGE1.jpg”)< /强>,我得到了结果。到目前为止还不错 问题

从C+呼叫Lua+;在线程中 我在Lua中有一个分类器模型来预测图像中的人的性别,我需要从C++调用它。我正在使用luacapi 我有一个单一的预测,我的意思是,在C++中,我调用 DOFILE(“脚本·LUA”)< /St>并且从磁盘加载模型,然后调用预测(“IMAGE1.jpg”)< /强>,我得到了结果。到目前为止还不错 问题,c++,multithreading,lua,singleton,C++,Multithreading,Lua,Singleton,问题是我需要能够使用线程调用predict函数(同时调用多个线程),因为predict需要一段时间才能返回。 这个模型相当大,所以我需要以某种方式加载它一次,然后像一个单例一样使用它 我怎样才能实现这样的事情?还是不可能/不可行?到目前为止,我已经尝试过了,但都没有成功: 如果有一个model.lua文件,其中只有作为单例的模型和脚本.lua将获得该模型的一个实例,并在第一次加载它。然后在C++中,我将有一个新的 LuaStAuth和 DOFILE(“Script Suxa”)< /强>每当我

问题是我需要能够使用线程调用predict函数(同时调用多个线程),因为predict需要一段时间才能返回。 这个模型相当大,所以我需要以某种方式加载它一次,然后像一个单例一样使用它

我怎样才能实现这样的事情?还是不可能/不可行?到目前为止,我已经尝试过了,但都没有成功:

  • 如果有一个model.lua文件,其中只有作为单例的模型和脚本.lua将获得该模型的一个实例,并在第一次加载它。然后在C++中,我将有一个新的<强> LuaStAuth<强>和<强> DOFILE(“Script Suxa”)< /强>每当我需要做一个预测时。我试过了,但每次都在加载模型
  • 在C++中使用静态对象“强”> LuaSuthOnt/Stand >“强>模型”。Lua始终在内存中,将模型返回到C++(作为表)。然后将它发送到lua的脚本.lua,比如:预测(model,“image1.jpg”) 类似于前一个,但不是将模型返回到C++并将其返回到Lua,而是将回调函数返回到C++,将其返回到LUA并使用它来获得模型。示例:model.lua有一个getModel()函数,该函数将返回模型。我会将<强> GETMe建模()/<强>返回到C++并将其发送到<强>脚本。Lua,例如:<强>预测(GETMeod,IMAGE1.jpg)<<强>。然后,predict函数将调用getModel()来获取模型
更新 谢谢你们的反馈。一旦不可能实现我所需要的,我就放弃了使用C API来实现Lua和C++之间的通信的想法。p>

相反,我运行一个带有Lua-使用的服务器,并且从C++中,我每次需要进行预测时,都会创建一个新的连接到LuA套接字。p> 问候,,


Sérgio

对于原始Lua,您想要的通常是不可能的。它本质上是一个单线程系统。虽然可以创建多个可以在独立线程上运行的独立
lua\u状态
对象,但不能从两个不同的线程调用同一
lua\u状态
实例

您可以尝试,这表面上是Lua的线程框架。但是,它仍然需要单独的
lua_状态
s;它所做的主要事情是(至少在理论上)提供了一种在
lua_State
s之间共享数据的轻量级方式


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

加载模型,然后使用
lua\u newthread
创建线程实例以运行
predict
实例?lua仅设计用于单线程。不过,您可以有多个单独的Lua虚拟机。或者你可以使Lua代码将多个图像传递给C++,C++启动一组线程,对图像进行分类,停止它们并将结果返回到Lua。