3

在 lua 中使用 dofile 运行一个几乎微不足道的脚本 10000 次,在这台机器上大约需要 52 秒,但如果我运行 10000 次“lua52 script.lua”,则需要 3 或 4 倍以上。我知道涉及更多系统调用和其他开销,但我试图实现的是运行脚本,超时时间为 3 秒,并打印输出。我的问题是带有无限循环的脚本,无论是否有意,例如:

while(true) do
end

我可以在 Lua 中为 dofile 设置超时吗?每次使用 timeout(3) 调用解释器是我唯一的选择吗?

4

3 回答 3

4

对于像我这样的新手来说,在 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)
于 2012-07-11T03:14:02.220 回答
1

如果您不在脚本中调用 C 函数,您可以使用具有大计数值的计数钩子并在钩子内引发错误:

local function f() error"timeout!" end
debug.sethook(f,"count",1e6)
while true do end

在您的应用程序中,在调用dofile之前设置计数挂钩。

每n条Lua VM 指令调用一次计数挂钩。但是,没有办法考虑 C 函数所花费的时间,因此我在上面提出警告。

于 2012-06-30T00:39:27.447 回答
0

没有内置设施,尝试使用lalarm库。

于 2012-06-29T21:07:12.950 回答