台机器中,使用 dofile 在 lua 中运行一个几乎微不足道的脚本,10000 次,大约需要 52 秒,但如果我运行 10000 次"lua52 script.lua",则需要 3 或 4 倍。我知道涉及更多的系统调用和其他开销,但我试图实现的是运行超时为 3 秒的脚本,并打印输出。我的问题是有意或无意的无限循环脚本,例如:
while(true) do
end
我可以在 Lua 中为 dofile 设置超时吗?我是否只能选择每次都呼叫口译员超时(3)?
对于像我这样的新手来说,在 Lua 问题上纠正 lhf 感觉有点不对劲,但在这里; 将"count"传递给debug.sethook与传递"c"或"call"相同,在n VM指令之后传递以触发关联函数的正确掩码是"。
因此,要限制从 dofile() 加载的代码的运行时,请使用如下所示的内容:
local f = function() error("timeout") end
local x,y = xpcall(function()
debug.sethook(f, "", 1e8)
local ret = dofile("script.lua")
debug.sethook()
return ret
end, debug.traceback)
如果你没有在脚本中调用 C 函数,你可以使用具有较大计数值的 count hook 并在钩子内引发错误:
local function f() error"timeout!" end
debug.sethook(f,"count",1e6)
while true do end
在应用程序中,在调用 dofile 之前设置计数挂钩。
计数钩子每 n 个 Lua VM 指令调用一次。但是,没有办法解释 C 函数所花费的时间,因此我在上面警告。
没有内置功能,请尝试使用lalarm库。