2014-02-07 27 views
2

我有一个web worker用ajax-requests运行耗时的例程任务。我可以从主线程中终止它们而不是等待它们完成吗?是否有可能终止正在运行的web worker?

这就是我如何产卵和终止它:

$("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); 
+0

实施不受欢迎的机器人那些有用这取决于你如何产生线程。你需要显示你的代码或者至少给我们更多的信息。 – Liam

+1

我已经问了一些关于网络工作者的问题,并且遇到了很多错误和故障。这个功能看起来不错,但非常原始。我不想在最近的将来再尝试使用它。 – Gherman

+0

值得注意的是它在Opera 12 \ m /中可以正常工作。至少看起来如此。 – Gherman

回答

6

你可以杀死使用terminate()任何webworker。

MDN举例:

的Worker.terminate()方法立即终止工人。这不会为工人提供完成作业的机会;它只是立即停止。

+0

“你正在终止()'ed” - [Thanks Arnold](http://www.youtube.com/watch?v=iy_BBBGBpqA) – Wez

+1

这就是我试图做的。但工人完全忽略了这种方法。我确定它可以运行,但是什么都不做,因为'terminate()'后面的其他命令执行正常。这就是为什么我认为可能是因为工作人员没有采取行动,或者因为它正在等待ajax请求完成。有趣的是,如果工作人员没有完成僵尸,那么在关闭Firefox之后,Firefox会继续保留。在您手动终止该进程之前,不能再运行它。 (我在Ubuntu上) – Gherman

+0

@德国似乎与这个bugreport有关:https://bugzilla.mozilla.org/show_bug.cgi?id=872526 – Sirko

1

我做这个简单的脚本,并将其与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); 
     } 
    } 

只要主线程终止webworker所以它不会收到postmessage更多但webworker仍在场景下运行,这是一个输出:

"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 
+0

我所做的最好的就是使用** myWorker.postMessage({type:'loop',n:100}); **使它执行作业并** myWorker.postMessage({type:'stop',n :0}); **通过_self.close()_使WW自杀。此外,您需要更改WW _postmessage_以暂时中断自己(例如_setTimeout(myJob,50)_)。看起来WW只能在休眠模式下才能接收到另一个postmessage(从主线程)。 – mixer

0

的OP问清楚:

我可以从不是等待他们 完成一个主线程终止呢?

他不问工人应该如何优雅地退出内部。他想从外部线程非常不情愿地杀掉任何工人。

让我们给出一个现代现实世界的例子。

假设您想编写一些代码来杀死任何不受欢迎的网络工作者,他们会占用太多的资源(例如CPU,网络等)。进一步假设你不能改变工作人员正在运行的代码。

网络工作者有一种叫做“生命周期”的东西。他们将在特定条件下自行终止。

  • 您可以通过关闭创建它的网页杀专用工人。 这就是专用的意思 - 它只允许服务单个 页面。关闭该页面将调用专用工作人员的自行终止序列 。

  • 通过关闭创建它的域 的所有页面,您可以杀死共享 worker。这就是共享意味着 - 它只允许 服务于单个域的页面。关闭所有域页面 将调用共享工作人员的自终止序列。

  • 其他工人类型也可以通过关闭所有域页面来杀死。

下面是一些不受欢迎的网络工作者窃取你的CPU的例子:

// Load 16 CPU threads 100% using Web Workers 
 

 
var code = "while(true){}"; 
 

 
var Blob = window.Blob; 
 
var URL = window.webkitURL || window.URL; 
 
var bb = new Blob([code], { type: 'text/javascript' }); 
 

 
code = URL.createObjectURL(bb); 
 

 
// Hasta la vista ... 
 

 
new Worker(code); new Worker(code); new Worker(code); new Worker(code); 
 
new Worker(code); new Worker(code); new Worker(code); new Worker(code); 
 
new Worker(code); new Worker(code); new Worker(code); new Worker(code); 
 
new Worker(code); new Worker(code); new Worker(code); new Worker(code);
<img src="https://i.stack.imgur.com/vgjCo.jpg" width="100%">

注意,只有关闭页面杀死所有的工人。使用你的CPU监视器来确认。

希望这个答案将是希望建立终结者扩展和插件,猎杀作为网络工作者(如:bitmining机器人窃取你的电力,移动数据计划等)

相关问题