在线程中从C++调用Lua

Call Lua from C++ in threads

本文关键字:调用 Lua C++ 线程      更新时间:2023-10-16

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

我让它用于单个预测,我的意思是,在C++中,我调用dofile("script.loa"(,然后从磁盘加载模型,然后调用predict("image1.jpg"(我得到了结果。到目前为止还不错。

问题

问题是,我需要能够使用线程(同时调用多个线程(调用predict函数,因为foredict

我该如何实现这样的事情?或者这不可能/不可行?到目前为止,我已经尝试过了,但都没有成功:

  • 如果有一个model.loa文件,其中只有作为单例的模型和脚本.rua,则会获得模型的一个实例,并在第一时间加载它。然后在C++中,每次需要进行预测时,我都会有一个新的lua_Statedofile("script.loa"(。我试过了,但每次都在加载模型
  • 在C++中有一个静态对象lua_State,且模型。lua始终在内存中,这将把模型返回到C++(作为表(。然后将其发送到lua的脚本。lua,如:predict(model,"image1.jpg"(
  • 与前一个类似,但不是将模型返回到C++并将其发送回lua,而是将回调函数返回到C++,将其发送回到lua并使用它来获取模型。示例:model.loa有一个getModel((函数,该函数将返回模型。我会将getModel((返回到C++,并将其发送到script.loa,如:predict(getModel,"image1.jpg"(.然后predict函数会调用getModel((来获得模型

更新

谢谢你们的反馈。一旦无法实现我需要的东西,我就放弃了使用C API在Lua和C++之间进行通信的想法。

相反,我使用luasched运行一个带有Lua的服务器,每次需要进行预测时,我都会从C++创建一个到Lua套接字的新连接。

谨致问候,Sérgio

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

你可以试试Lua-Lanes,它表面上是Lua的线程框架。然而,它仍然需要单独的lua_State;它所做的主要事情是(至少在理论上(提供一种在lua_State之间共享数据的轻量级方式。

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