【问题标题】:Call Lua from C++ in threads在线程中从 C++ 调用 Lua
【发布时间】: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_Statedofile("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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2014-09-01
    • 2013-02-19
    相关资源
    最近更新 更多