在线程中从 C++ 调用 Lua
2016-3-15 11:44:20
收藏:0
阅读:54
评论:1
我有一个 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
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
无法在 Lua 中实现多线程
使用原始的 Lua 无法实现您想要的通用功能,因为它是单线程系统。虽然可以创建多个独立的
lua_State对象,可以在独立的线程上运行,但不能从两个不同的线程调用同一lua_State实例。您可以尝试 Lua Lanes,这是一个面向 Lua 的线程框架。但是,它仍然需要单独的
lua_State,其主要作用是(至少在理论上)提供一种轻量级的方式来共享lua_State之间的数据。或者,您可以创建数量等于您拥有的核心数的许多 _进程_。每个进程都必须独立加载模型,但是您将永远不会比您要使用的核心数更多次地加载模型。但是这种方式,每个进程都可以执行任意数量的
predict调用。您甚至可以从 stdin 中获取文件名,这样允许某个主要进程将工作分配给单个进程。