在lua上用dofile運行一個幾乎平凡的腳本10000次,在這臺機器上花費大約52秒,但是如果我運行10000次「lua52 script.lua」,它需要3或4次以上。我知道有更多的系統調用和其他開銷,但我試圖實現的是運行腳本,例如超時3秒,並打印輸出。 我的問題是有無限循環,有意還是無意,例如腳本:如何執行Lua腳本運行時限制?
while(true) do
end
我可以做一個dofile處理超時從在Lua? 是我每次用超時(3)調用解釋器的唯一選擇嗎?
在lua上用dofile運行一個幾乎平凡的腳本10000次,在這臺機器上花費大約52秒,但是如果我運行10000次「lua52 script.lua」,它需要3或4次以上。我知道有更多的系統調用和其他開銷,但我試圖實現的是運行腳本,例如超時3秒,並打印輸出。 我的問題是有無限循環,有意還是無意,例如腳本:如何執行Lua腳本運行時限制?
while(true) do
end
我可以做一個dofile處理超時從在Lua? 是我每次用超時(3)調用解釋器的唯一選擇嗎?
對於像我這樣的新手來說,糾正lhf對Lua的問題感覺有點不對,但是這裏就是這樣;傳遞「count」到debug.sethook與傳遞「c」或「call」相同,正確的掩碼在之後傳遞以激發關聯的函數 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)
沒有內置設施,請嘗試使用lalarm庫。
如果你沒有在腳本中調用了C函數可以使用計數鉤具有較大計數值,提高鉤內部的錯誤:
local function f() error"timeout!" end
debug.sethook(f,"count",1e6)
while true do end
在您的應用程序,設置在致電dofile之前計數掛鉤。
count掛鉤被調用每n Lua VM指令。但是,無法解釋C函數所花費的時間,因此我需要在上面提出警告。
'count'對我來說工作正常。我用'stdin:1:timeout!'放棄了代碼。 – lhf
很奇怪;傳遞''count''在你發佈的代碼中按預期工作,但它在我發佈的代碼中立即中止(script.lua只包含'while true do end')。在這兩種情況下,傳遞''「''按預期工作。 – furq