Javascript 是否可以终止正在运行的web worker?
我有一个web工作人员使用ajax请求运行耗时的例行任务。我可以从主线程终止它们而不等待它们完成吗 我就是这样产生和终止它的: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.
$("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明确提出:
我可以在主线程中终止它们而不等待它们终止吗
结束
他不是在问员工应该如何优雅地从内部离职。他想非常不礼貌地从外部线程杀死任何工人
- 您可以通过调用其
函数来杀死任何web工作者,前提是工作者实例位于上下文范围内terminate()
- 您可以通过关闭创建该工作程序的页面/框架来杀死该工作程序。 这就是“专心致志”的意思——它只允许为一个人服务 页关闭页面将调用专用工作人员的 自终止序列
- 您可以通过关闭域的所有页面来杀死一个共享的工作者 这就创造了它。这就是共享的意思——它是 允许从一个域服务多个页面。关闭所有域页面 调用共享工作进程的自终止序列
- 其他工作类型也可以通过关闭所有域页来终止
//创建消耗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