简体   繁体   English

停止后如何重新启动Web Worker

[英]how to restart web worker after stop

I am using web worker in my application. 我在应用程序中使用Web Worker。 At certain point I want to stop my web worker and restart it. 在某些时候,我想停止我的网络工作者并重新启动它。 Stopping web worker is working fine, then I post some message to web worker, its not responding unless I reload the page. 停止网络工作者可以正常工作,然后我向网络工作者发布一些消息,除非重新加载页面,否则它不会响应。 So I want to know how to restart the web worker after stop it without reloading the page. 所以我想知道如何在停止它之后重新启动Web Worker,而不重新加载页面。

Main.js Main.js

var ww = new Worker("worker.js");

function mainFunction(){
  //some code to form data
 f1(data,function(res){
      return res;
};

function f1(data,callback){
  ww.postMessage({'action':'action1'});
  ww.onmessage = function(event){
  var response = event.data;
  callback(response);
}

function f2(){
  ww.postMessage({'action':'stopWW'});
  ww.postMessage({'action':'reStartWW'});
  ww.onmessage = function(event){
    mainFunction();
  }
}

In worker.js 在worker.js中

self.addEventListener('message',function(e){
   var functionName=e.data.action;

   switch(functionName){
      case 'stopWW':
        self.close();
      break;
      case 'reStartWW':
        var test = {'key':1}
        self.postMessage(test);
      break;
      case 'action1':
         //do something
         self.postMessage(somedata);
         break;
      }
  });

I would suggest you to create a webworker in a function, with this in you can call it multiple times. 我建议您在一个函数中创建一个Webworker,通过它您可以多次调用它。

var ww;
function setWebWorker() {
    if(typeof(Worker) !== "undefined") {
        if(typeof(ww) == "undefined") {
              ww = new Worker("worker.js");
       }
    }
}
setWebWorker();

just like this page suggests. 就像本页所建议的一样。

Once close() or terminate() have been called, your worker is effectively closed and should be unreachable. 一旦调用close()terminate() ,您的工作程序将被有效关闭,并且无法访问。 You could create a new worker by calling ww = new Worker("worker.js"); 您可以通过调用ww = new Worker("worker.js");创建一个新的worker ww = new Worker("worker.js"); again, but the internal state of the first worker won't be acessible anymore. 再次,但是第一个工作人员的内部状态不再是必需的。

Now if what you want is to essentially pause the worker, but keep it ready for restart with its internal state, I'd recommend simply switching listeners. 现在,如果您要实质上暂停工作程序,但准备好以其内部状态重新启动它,则建议您简单地切换侦听器。 Something like this : 像这样的东西:

function whenActive(event){
   var functionName=e.data.action;

   switch(functionName){
      case 'stopWW':
        self.removeEventListener("message", whenActive);
        self.addEventListener("message", whenNotActive);
        //do other stopping actions
        break;
      [...]//your other cases, but not "restartWW"
   }
}
function whenNotActive(event){
   var functionName=e.data.action;

   if(functionName === 'reStartWW'){
        self.addEventListener("message", whenActive);
        self.removeEventListener("message", whenNotActive);

       [...]//do other re-startup actions
   }
}

//start the cycle
self.addEventListener("message", whenActive);

How do you restart your worker? 您如何重新启动工作人员?

Your declaration of the web worker is only done once at page load from looking at your code. 通过查看代码,仅在页面加载时对Web worker进行一次声明。

Please see: https://www.w3schools.com/html/html5_webworkers.asp for some color. 请访问: https//www.w3schools.com/html/html5_webworkers.asp了解一些颜色。

var w;

function startWorker() {
    if(typeof(Worker) !== "undefined") {
        if(typeof(w) == "undefined") {
            w = new Worker("demo_workers.js");
        }
        w.onmessage = function(event) {
            document.getElementById("result").innerHTML = event.data;
        };
    } else {
        document.getElementById("result").innerHTML = "Sorry! No Web Worker support.";
    }
}

function stopWorker() { 
    w.terminate();
    w = undefined;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM