Javascript 是否可以终止正在运行的web worker?

Javascript 是否可以终止正在运行的web worker?,javascript,web-worker,Javascript,Web Worker,我有一个web工作人员使用ajax请求运行耗时的例行任务。我可以从主线程终止它们而不等待它们完成吗 我就是这样产生和终止它的: $("button.parse-categories").click(function() { if (parseCategoriesActive==false) { parseCategoriesActive = true; parseCategoriesWorker = new Worker("parseCategories.

我有一个web工作人员使用ajax请求运行耗时的例行任务。我可以从主线程终止它们而不等待它们完成吗

我就是这样产生和终止它的:

$("button.parse-categories").click(function() {
    if (parseCategoriesActive==false) {
        parseCategoriesActive = true;
        parseCategoriesWorker = new Worker("parseCategories.js");


        $("button.parse-categories-cancel").click(function() {
            parseCategoriesWorker.terminate();
            parseCategoriesActive = false;
        });             
    }
});
这是工人代码:

function myAjax(url, async, callback) {
    xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
            callback(xmlhttp.responseText);
        if (xmlhttp.readyState==4 && xmlhttp.status!=200) {
            self.postMessage("error");
            throw "error in ajax: "+xmlhttp.status;
        }
    }
    xmlhttp.open("GET", url, async);
    xmlhttp.send();
}

var parseCategoriesActive = true;
var counter = 0;
do {
    myAjax('parser.php', false, function(resp) {
        if (resp=='success')
            parseCategoriesActive = false;
        else {
            counter += Number(resp);
            self.postMessage(counter);
        }       
    });
} while (parseCategoriesActive==true);

你可以用它杀死任何网络工作者

引用自:

方法的作用是:立即终止工作进程。这并没有给工人提供完成作业的机会;它只是立即停止


我编写了这个简单的脚本,FF和Chrome的问题似乎仍然存在:

    var myWorker = new Worker("w.js");

    myWorker.onmessage = function(e) {
        console.log('Message received from worker:'+e.data);
    }
    myWorker.postMessage(100);
    setTimeout(stopWW, 500) ;

    function stopWW(){
        console.log('TERMINATE');
        myWorker.terminate();
    }
而webworker是:

    onmessage = function(e) {
      var n = e.data;
      console.log('Message received from main script:'+n);
      for (var i=0;i<n;i++){
        console.log('i='+i);
         postMessage(i);
      } 
    }
OP明确提出:

我可以在主线程中终止它们而不等待它们终止吗 结束

他不是在问员工应该如何优雅地从内部离职。他想非常不礼貌地从外部线程杀死任何工人

  • 您可以通过调用其
    terminate()
    函数来杀死任何web工作者,前提是工作者实例位于上下文范围内
网络工作者也有一个生命周期。它们将在特定条件下自行终止

  • 您可以通过关闭创建该工作程序的页面/框架来杀死该工作程序。 这就是“专心致志”的意思——它只允许为一个人服务 页关闭页面将调用专用工作人员的 自终止序列

  • 您可以通过关闭域的所有页面来杀死一个共享的工作者 这就创造了它。这就是共享的意思——它是 允许从一个域服务多个页面。关闭所有域页面 调用共享工作进程的自终止序列

  • 其他工作类型也可以通过关闭所有域页来终止

下面是一个终止一些不受欢迎的、窃取您CPU的worker Bot的示例:

//创建消耗CPU线程的工作程序bot
var Blob=window.Blob;
var URL=window.webkitURL | | window.URL;
var-numbots=4;
var-bots=[];
var bot=“while(true){}”;
bot=newblob([bot],{type:'text/javascript'});
bot=URL.createObjectURL(bot);
//入侵者。。。

对于(var i=0;这取决于你如何生成线程。你需要显示你的代码或至少向我们提供更多信息。我已经问了几个关于web workers的问题,遇到了很多错误和故障。此功能看起来不错,但非常原始。我不想在最近的将来再尝试使用它。值得注意的是,它确实可以正常工作在Opera 12\m/。至少看起来是这样。@German我认为您的逻辑在这里是不正确的。从第一眼看,您创建了AJAX请求,直到其中一个成功。但与此同时,大量其他AJAX请求已经创建,它们各自的回调都在等待完成。我认为只有在上一个请求失败。因此,您在任何时候都只有一个活动AJAX。哦,抱歉。这不是实际的代码。复制时我破坏了它。标志是
false
,当然,它们是同步的。“您是
终止()
ed”-这就是我试图做的。但是工作人员完全忽略了此方法。我确信它会运行,但不会执行任何操作,因为
terminate()之后的其他命令
执行正常。这就是为什么我认为可能是因为工作进程没有停止,或者是因为它正在等待ajax请求完成。有趣的是,如果工作进程没有以僵尸的形式完成,firefox进程会在关闭firefox后继续运行。在手动终止该进程之前,它不能再次运行。(我在Ubuntu上)@德语它似乎与此错误报告相关:
terminate()
在Chrome中也不起作用,尽管Chrome在关闭浏览器时没有这个错误。@德语很有趣。你能举个例子吗?我想挂起的AJAX回调不会被清除,所以也许一些重构至少可以解决这个问题。我做的最好的方法是使用myWorker.postMessage({type:'loop',n:100});要使其执行作业和myWorker.postMessage({type:'stop',n:0});要使WW通过self.close()自杀。此外,您需要更改WW postMessage以中断自身一段时间(例如setTimeout(myJob,50))。似乎WW只有在睡眠模式下才能接收另一条postMessage(来自主线程)。
"Message received from main script:100" w.js:3:2
"i=0" w.js:5:1
"Message received from worker:0" w.html:6:2
"i=1" w.js:5:1
...
"Message received from worker:21" w.html:6:2
"i=22" w.js:5:1
"TERMINATE" w.html:13:1
"i=23" w.js:5:1
"i=24" w.js:5:1
...
"i=99" w.js:5:1