我有一个复杂的javascript函数,可能需要1秒钟,或者很长时间才能发送答案。所以我创建了一个正在工作的Worker,我在Swift的UIWebView中调用了这个函数(stringByEvaluatingJavaScriptFromString)。我只等了5秒钟(在同一个Javascript中创建超时),之后我终止了worker(job.terminate()),然后我用其他参数(简化)开始另一个参数(只需1秒)在显示答案。问题是,即使在终止信号之后,第一个工作人员似乎也在后台运行。正如您在图像中看到的那样,WebCore:Worker具有大量的CPU使用率。我怎样才能真正终止工人呢?
job = new Worker("main.js");
var t = setTimeout(function(){
stop();
logNode.innerText = 'NULL';
},5000);
function stop() {
job.terminate();
job = undefined;
}
(main.js):
importScripts('dist/algorithm.js');
var lp;
self.addEventListener('message', function(e) {
...
...
答案 0 :(得分:1)
终止worker(并确保它)的最简单方法是注入一个布尔表达式,使代码出现" exception out"它的主循环(如果代码中只有1或2个瓶颈,甚至可以优雅地返回)。并且您可以在让它自然退出之前在catch块中执行任何所需的清理。
我个人讨厌使用终止或终止等函数结束线程,因为它可能会使事物处于未定义状态
对终止的调用可能会被忽略或排队,因为工作人员正在使用它可以留下没有时间进行消息处理的所有资源。