加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 21:45:38 所属栏目:大数据 来源:网络整理
导读:我正在使用LuaJ在 Java中运行用户创建的Lua脚本.但是,运行永不返回的Lua脚本会导致Java线程冻结.这也使线程不可中断.我运行Lua脚本: JsePlatform.standardGlobals().loadFile("badscript.lua").call(); badscript.lua包含而真正的结束. 我希望能够自动终止
我正在使用LuaJ在 Java中运行用户创建的Lua脚本.但是,运行永不返回的Lua脚本会导致Java线程冻结.这也使线程不可中断.我运行Lua脚本:

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

badscript.lua包含而真正的结束.

我希望能够自动终止陷入不屈服循环的脚本,并允许用户在运行时手动终止他们的Lua脚本.我读过有关debug.sethook和pcall的内容,但我不确定如何将它们用于我的目的.我也听说沙盒是一个更好的选择,虽然这有点超出我的范围.

这个问题也可能仅扩展到Java线程.我没有找到任何有关中断Java线程的确切信息(真实);

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

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

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

一些来源:

> Embedded Lua – timing out rogue scripts (e.g. infinite loop) – an example anyone?
> Prevent Lua infinite loop
> Embedded Lua – timing out rogue scripts (e.g. infinite loop) – an example anyone?
> How to interrupt the Thread when it is inside some loop doing long task?
> Killing thread after some specified time limit in Java

解决方法

我努力解决同样的问题,经过一些挖掘调试库的实现后,我创建了一个类似于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 {}
}

只需从新线程内部执行脚本,并将中断设置为true即可停止执行.该异常将被封装为抛出时引发LuaError的原因.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读