col*_*son 4 java lua multithreading interrupt luaj
我正在使用LuaJ在Java中运行用户创建的Lua脚本.但是,运行永不返回的Lua脚本会导致Java线程冻结.这也使线程不可中断.我运行Lua脚本:
JsePlatform.standardGlobals().loadFile("badscript.lua").call();
Run Code Online (Sandbox Code Playgroud)
badscript.lua
包含while true do end
.
我希望能够自动终止陷入不屈服循环的脚本,并允许用户在运行时手动终止他们的Lua脚本.我已经阅读了有关debug.sethook和pcall的内容,但我不确定我是如何正确地将它们用于我的目的.我也听说沙盒是一个更好的选择,虽然这有点超出我的范围.
这个问题也可能仅扩展到Java线程.我没有找到任何有关中断Java线程的确切信息while (true);
.
在线Lua的演示是非常有前途的,但似乎的检测和"坏"的脚本终止在CGI脚本,而不是Lua中完成.我是否可以使用Java来调用CGI脚本,该脚本又调用Lua脚本?不过,我不确定是否允许用户手动终止他们的脚本.我丢失了Lua演示源代码的链接,但我手头有它.这是神奇的路线:
tee -a $LOG | (ulimit -t 1 ; $LUA demo.lua 2>&1 | head -c 8k)
Run Code Online (Sandbox Code Playgroud)
有人能指出我正确的方向吗?
一些来源:
我努力解决同样的问题,经过一些挖掘调试库的实现后,我创建了一个类似于David Lewis提出的解决方案,但是通过提供我自己的DebugLibrary来实现:
package org.luaj.vm2.lib;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;
public class CustomDebugLib extends DebugLib {
public boolean interrupted = false;
@Override
public void onInstruction(int pc, Varargs v, int top) {
if (interrupted) {
throw new ScriptInterruptException();
}
super.onInstruction(pc, v, top);
}
public static class ScriptInterruptException extends RuntimeException {}
}
Run Code Online (Sandbox Code Playgroud)
只需从新线程中执行脚本并设置interrupted
为true即可停止执行.该异常将被封装为LuaError
抛出时的原因.