用于解决多线程方法的Lua异步解释器?
2013-11-20 8:10:53
收藏:0
阅读:187
评论:2
我的一般想法是,单线程应用程序(Lua解释器)将始终降低依赖它的多线程应用程序(通用C++应用程序)的性能。
为了避免这个问题,我正在考虑在解释器上采用异步方法,同时保持C++应用程序的多线程,这基本上意味着基于我的方法,Lua解释器应该以异步方式将整个脚本/文件推送到调度程序中(而不等待结果),而由精心设计的C++多线程消息系统来保持一切连续。
通常的关系是“C/C++函数<->Lua”(采用顺序方法);我想要的是“C++消息系统<->整个Lua脚本”。
我也对任何能解决这个问题并真正帮助Lua和设计为多线程的C++应用程序之间混合的方法持开放态度。
是否有一些软件可以实现这种方法?
编辑
我需要一些“用户友好”的东西,并且需要在C++/Lua API设计中直接实现这种行为。
点赞
用户1244588
Lua 中的并发是一个有很多解决方案的话题。这里是一个资源:
实际上,你可以让自己轻松一些,因为你实际上不需要让 Lua 本身多线程运行,这会带来许多额外的问题。
显而易见的解决方案是在一个单独的线程中运行 Lua,但只提供一个薄薄的 API,其中每个 API 调用立即分叉一个新的线程/进程,或者使用某种消息传递实现异步数据传输,甚至使用短期信号量读取/写入一些值。除非你想进行繁忙的等待,否则这种解决方案需要某种空闲循环或事件监听器...
我认为另一个仍然很容易通过新 API 实现的选项是采用 node.js 的方法:
- 在单独的线程中运行 Lua
- 将整个 API 设计成只接受回调函数的函数。这些回调函数会被排队,并可由你的 C++ 应用程序进行调度。
- 你甚至可以为标准 Lua API 提供回调包装器,但不需要这样做。
举个例子:
local version;
Application.requestVersionNumber(function(val) version = val; end)
当然,这个示例非常简单,但你可以理解这个思路。
但你应该知道的一件事是,使用回调函数的方式会使脚本很快变得高度分层,如果你不小心的话。虽然这对性能来说并不是坏事,但可能会使阅读难度加大。
2013-11-20 15:54:50
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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 协程。通过 coroutine.yield(messagedata) 向 C++ 发送消息,然后通过 lua_resume 发送结果。(参见:lua_newthread)。你甚至可以将你的函数包装一下,提供一个更好的事件 UI。
function doThing(thing, other, data) return coroutine.yield("doThing", thing, other, data) end仍然只能在任何给定时间内运行一个线程的 lua 解释器(你必须进行锁定),但你可以同时运行多个这样的协程。