如何为luavm创建抢占式调度程序?

如何为luavm创建抢占式调度程序?,lua,virtual-machine,Lua,Virtual Machine,我一直在看lua和lvm.c。我非常希望实现一个接口来控制VM解释器的状态 lua内部的协作多任务处理对我不起作用(用户贡献的代码) 调试钩子只让我得到了其中的大约50%,指令执行限制,但它引发了一个异常,这只会使正在运行的lua代码崩溃——但我需要能够进一步调整它 我想创建一个系统,其中运行着10个成千上万的lua用户脚本——单个线程不起作用,执行限制会让新手开发人员头疼,我还要控制执行速度。但最终 while true do end 将永远执行,我真的不在乎 有什么想法、帮助或其他实现,

我一直在看lua和lvm.c。我非常希望实现一个接口来控制VM解释器的状态

lua内部的协作多任务处理对我不起作用(用户贡献的代码)

调试钩子只让我得到了其中的大约50%,指令执行限制,但它引发了一个异常,这只会使正在运行的lua代码崩溃——但我需要能够进一步调整它

我想创建一个系统,其中运行着10个成千上万的lua用户脚本——单个线程不起作用,执行限制会让新手开发人员头疼,我还要控制执行速度。但最终

while true do

end
将永远执行,我真的不在乎

有什么想法、帮助或其他实现,我可以看看吗

编辑:这不是关于沙箱的,假装我是该领域的专家

编辑:我不想使用内部运行的基于lua代码的协同程序的控制器

编辑:我想运行一个线程,并管理大量用户贡献的lua脚本,外部进程级控制机制根本无法扩展。

您可以搜索lua沙盒实现;例如,这将提供一些指针。注意,沙箱中的大部分工作都集中在不允许执行错误代码上,但不一定要防止无限循环。为了更好地控制,您可能需要将Lua沙箱与类似或的东西结合起来。(根据评论不相关)

如果您正在寻找基于Lua的、轻量级的、但不一定100%万无一失的东西,那么您可以尝试在单独的协程中运行客户机代码,并在该协程上设置一个调试钩子,该钩子将每第N行触发一次。在这个钩子中,您可以检查正在运行的进程是否超过了它的引号。您还需要注意启动的新协同路由,因为它们需要设置自己的钩子(您需要禁用coroutine.create/wrap,或者用设置所需调试钩子的内容替换它们)

本例中的代码可能如下所示:

local coro = coroutine.create(client_func)
debug.sethook(coro, debug_hook, "l", 1000) -- trigger hook on every 1000th line
它不是万无一失的,因为它可能会阻塞某些IO操作,而调试钩子在这方面没有帮助

[根据更新的问题和评论进行编辑]

在“无lua代码基于协同程序的控制器”和“无外部过程控制机制”之间,我认为您没有太多选择。可能您唯一的选择是每个用户运行一个VM脚本,并以某种方式给这些VM打勾(最近有一个关于这方面的问题,但我找不到)。在走这条路线之前,我仍然会尝试使用协同路由(可以轻松扩展到数万个;Tir声称使用基于协同路由的体系结构)

该机制大致如下所示:安装调试钩子(如上所示),然后从该钩子返回控制器,控制器决定恢复其他协同程序(用户脚本)。我一直在开发这个机制(尽管它只针对一个客户端脚本)。这并不能保护您免受可能阻塞的IO调用的影响,为此,您可能仍然需要在VM级别设置一个看门狗,以查看它是否被阻塞的时间超过需要的时间


如果您需要序列化和反序列化保留UPVALUE等的运行代码片段,那么这可能是您唯一的选择。

请查看实现
lua\u lock
lua\u unlock

看看露露。它是写在lua上的lua虚拟机。是给Lua5.1的 对于较新的版本,您需要做一些工作。但到那时你真的可以做一个schelduler了。

看看这个,
我维护这个项目。它是一个非阻塞抢占式调度程序,用于运行lua代码。适用于长时间运行的游戏脚本。

沙箱不是我感兴趣的,事实上我可能不在乎它们是否可以包含外部库或任何东西-我会的,但我会在到达那里时跨越这座桥(lua中的沙箱,可以说是一个微不足道的练习,有些人不会,但假设我会)我不认为LXC和cpulimit可以扩展到10000个,我建议我要运行(运行缓慢,这不是问题)-假设我同时运行1000000个lua脚本。您的建议是否仍然适用于该场景?debug_hook解决方案我不知道我可以从协同程序控制器脚本中创建一个有效的解决方案-我宁愿从C中管理它们。有几个原因-其中之一是“进程远程传输”或其他什么,我可以使用运行的lua脚本,内存映射暂停它,对它进行pickle,然后将它发送到另一个进程,甚至是计算机,以允许将其扩展到并发运行的大量脚本,并实现“负载平衡”。老实说,我觉得您的回复信息丰富,可能对lua知之甚少,它没有注意到我所问的问题。坦白地提供了我在问题中提到的我不感兴趣的解决方案。@Prozacgod:更新了帖子。很抱歉,你觉得我回答的问题与你问的不同。你做了一些改变,这有助于澄清你想做什么,你要求我提供一些想法。