gpt4 book ai didi

java - Lua/Java/LuaJ - 处理或中断无限循环和线程

转载 作者:搜寻专家 更新时间:2023-11-01 01:53:41 26 4
gpt4 key购买 nike

我正在使用 LuaJ 在 Java 中运行用户创建的 Lua 脚本。但是,运行永不返回的 Lua 脚本会导致 Java 线程卡住。这也使线程不可中断。我运行 Lua 脚本:

JsePlatform.standardGlobals().loadFile("badscript.lua").call();

badscript.lua 包含 while true do end

我希望能够自动终止陷入死循环的脚本,并允许用户在运行时手动终止他们的 Lua 脚本。我读过有关 debug.sethookpcall 的信息,但我不确定如何正确使用它们来达到我的目的。我还听说沙盒是一个更好的选择,尽管这有点超出我的能力范围。

这个问题也可以单独扩展到 Java 线程。我还没有找到任何关于中断卡在 while (true); 中的 Java 线程的明确信息。

在线 Lua demo 非常 很有前途,但似乎“坏”脚本的检测和终止是在 CGI 脚本中完成的,而不是 Lua。我可以使用 Java 调用 CGI 脚本,而 CGI 脚本又调用 Lua 脚本吗?不过,我不确定是否允许用户手动终止他们的脚本。我丢失了 Lua 演示源代码的链接,但我手边有。这是神奇的一行:

tee -a $LOG | (ulimit -t 1 ; $LUA demo.lua 2>&1 | head -c 8k)

有人能指出我正确的方向吗?

一些来源:

最佳答案

我遇到了同样的问题,在深入了解调试库的实现之后,我创建了一个类似于 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 {}
}

只需从一个新线程中执行您的脚本并将 interrupted 设置为 true 以停止执行。抛出时,异常将被封装为 LuaError 的原因。

关于java - Lua/Java/LuaJ - 处理或中断无限循环和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17496868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com