空手道 - 请求多线程访问 - 问题
Karate - Multi threaded access requested - issue
我有超过 25 个功能文件涵盖了 100 多个测试,我有 karate-config.js,它有 3 个“karate.callSingle”函数,如下所示。
config.weatherParams = karate.callSingle(
"file:src/test/java/utils/AvailableForecasts.feature",
config
);
config.routingParams = karate.callSingle(
"file:src/test/java/utils/CalculationInput.feature",
config
);
config.vesselParams = karate.callSingle(
"file:src/test/java/utils/VesselStatus.feature",
config
);
当我在 callSingle 中使用类路径时出现同样的问题。
当我 运行 在启用并行(随机尝试 1-100 个线程)的情况下同时进行所有测试时,出现以下错误:
org.graalvm.polyglot.PolyglotException: Multi threaded access requested by thread Thread[pool-2-thread-8,5,main] but is not allowed for language(s) js.
- com.oracle.truffle.polyglot.PolyglotEngineException.illegalState(PolyglotEngineException.java:132)
- com.oracle.truffle.polyglot.PolyglotContextImpl.throwDeniedThreadAccess(PolyglotContextImpl.java:727)
- com.oracle.truffle.polyglot.PolyglotContextImpl.checkAllThreadAccesses(PolyglotContextImpl.java:627)
- com.oracle.truffle.polyglot.PolyglotContextImpl.enterThreadChanged(PolyglotContextImpl.java:526)
- com.oracle.truffle.polyglot.PolyglotEngineImpl.enter(PolyglotEngineImpl.java:1857)
- com.oracle.truffle.polyglot.HostToGuestRootNode.execute(HostToGuestRootNode.java:104)
- com.oracle.truffle.polyglot.PolyglotMap.entrySet(PolyglotMap.java:119)
在尝试了多种组合之后 - 令人惊讶的是,当我在 karate.config 中只有 2 个“callSingle”函数时(评论 VesselStatus.feature)然后它工作正常。
所有这 3 个“callSingle”调用 3 个不同的服务并将其他测试的变量设置为 运行,因此这 3 个很关键。
有没有办法,我们可以重新优化/带来不同的方法来避免上述问题?
这是一个已知问题,应该在 1.1.0.RC2 中修复
详情在这里:https://github.com/intuit/karate/issues/1558
能确认一下就好了
我在空手道实施中遇到了这个问题@peter-thomas。由于我们知道 graalVM js 引擎不支持 karate-config.js
的多线程,因此我刚刚找到了解决此问题的简单方法
解决方法是 - 我们可以等待一定的毫秒数,并且必须随机生成该毫秒数。
空手道内的代码如下-config.js请看一下-
function fn(){
// karate-config essential coding
var random_millis = Math.floor(Math.random() * 5000 - 1000 +1 )) + 1000;
java.lang.Thread.sleep(random_millis);
return something;
}
使用上面的代码,我尝试了我的 100 多个功能文件 运行 20 个带有空手道 1.2.0.RC1 的并行线程,它运行得非常好。
它是如何工作的 - 所有 20 个线程将一起跳转,同时到达 karate-config。但是如果我们在 1 到 5 秒(以毫秒为单位)之间应用一些过于随机的延迟,所有线程将等待不同的时间以避免多线程问题。
我也知道在 1 到 5000 毫秒之间,我们仍然有 1% 的机会得到相同的数字,但在我们得到这个问题的具体解决方案之前,我想我们可以使用这个解决方法。
谢谢,
索拉布
我有超过 25 个功能文件涵盖了 100 多个测试,我有 karate-config.js,它有 3 个“karate.callSingle”函数,如下所示。
config.weatherParams = karate.callSingle(
"file:src/test/java/utils/AvailableForecasts.feature",
config
);
config.routingParams = karate.callSingle(
"file:src/test/java/utils/CalculationInput.feature",
config
);
config.vesselParams = karate.callSingle(
"file:src/test/java/utils/VesselStatus.feature",
config
);
当我在 callSingle 中使用类路径时出现同样的问题。
当我 运行 在启用并行(随机尝试 1-100 个线程)的情况下同时进行所有测试时,出现以下错误:
org.graalvm.polyglot.PolyglotException: Multi threaded access requested by thread Thread[pool-2-thread-8,5,main] but is not allowed for language(s) js.
- com.oracle.truffle.polyglot.PolyglotEngineException.illegalState(PolyglotEngineException.java:132)
- com.oracle.truffle.polyglot.PolyglotContextImpl.throwDeniedThreadAccess(PolyglotContextImpl.java:727)
- com.oracle.truffle.polyglot.PolyglotContextImpl.checkAllThreadAccesses(PolyglotContextImpl.java:627)
- com.oracle.truffle.polyglot.PolyglotContextImpl.enterThreadChanged(PolyglotContextImpl.java:526)
- com.oracle.truffle.polyglot.PolyglotEngineImpl.enter(PolyglotEngineImpl.java:1857)
- com.oracle.truffle.polyglot.HostToGuestRootNode.execute(HostToGuestRootNode.java:104)
- com.oracle.truffle.polyglot.PolyglotMap.entrySet(PolyglotMap.java:119)
在尝试了多种组合之后 - 令人惊讶的是,当我在 karate.config 中只有 2 个“callSingle”函数时(评论 VesselStatus.feature)然后它工作正常。
所有这 3 个“callSingle”调用 3 个不同的服务并将其他测试的变量设置为 运行,因此这 3 个很关键。
有没有办法,我们可以重新优化/带来不同的方法来避免上述问题?
这是一个已知问题,应该在 1.1.0.RC2 中修复
详情在这里:https://github.com/intuit/karate/issues/1558
能确认一下就好了
我在空手道实施中遇到了这个问题@peter-thomas。由于我们知道 graalVM js 引擎不支持 karate-config.js
的多线程,因此我刚刚找到了解决此问题的简单方法解决方法是 - 我们可以等待一定的毫秒数,并且必须随机生成该毫秒数。
空手道内的代码如下-config.js请看一下-
function fn(){
// karate-config essential coding
var random_millis = Math.floor(Math.random() * 5000 - 1000 +1 )) + 1000;
java.lang.Thread.sleep(random_millis);
return something;
}
使用上面的代码,我尝试了我的 100 多个功能文件 运行 20 个带有空手道 1.2.0.RC1 的并行线程,它运行得非常好。
它是如何工作的 - 所有 20 个线程将一起跳转,同时到达 karate-config。但是如果我们在 1 到 5 秒(以毫秒为单位)之间应用一些过于随机的延迟,所有线程将等待不同的时间以避免多线程问题。
我也知道在 1 到 5000 毫秒之间,我们仍然有 1% 的机会得到相同的数字,但在我们得到这个问题的具体解决方案之前,我想我们可以使用这个解决方法。
谢谢, 索拉布