繁体   English   中英

如何处理对同一Web Worker的多个请求

[英]How to handle multiple request to same Web Worker

我创建了一个处理大量数据的网络工作者。 以下是代码实现:

worker.js

self.addEventListener('message', function(e) {
  console.log('Message received from main script');
  for(var i=0; i<999999999; i++){
    // computation here
  }
  console.log('Posting message back to main script');
  self.postMessage('You said: ' + e.data);
}, false);

主脚本

var myWorker;
if (window.Worker) {
  if(typeof(w)=="undefined"){
    myWorker = new Worker("scripts/controllers/workers.js");
  }
}
myWorker.addEventListener('message', function(e) {
    console.log('Message received from worker'+ e.data);
}, false);

function callWorker(someData){
  myWorker.postMessage(someData);
}
callWorker(someData);//first time call - by user click
callWorker(someOtherData);//second time call - again user click (don't want to disable button)

在这种情况下,我不想多次执行callWorker 我想要的是,如果callWorker当前正在执行,并且意味着在对callWorker的第二个请求提出时,则第一个请求应终止,第二个请求应处理(最新请求应处理)。

我怎样才能做到这一点? 感谢帮助

我想,您可以尝试终止该工作器并重新启动它。 当您调用终止方法时,它将立即终止,而无需等待操作完成。

myWorker.terminate();
myWorker = new Worker('worker.js');

如果callWorker当前正在执行,并且意味着在对callWorker的第二个请求提出时,则第一个请求应终止,第二个请求应处理(最新请求应处理)。

恐怕如果不终止工作人员,您将无法实现这一目标。 我认为您不应该尝试终止当前进程,而应该等到它完成后再发送下一条消息。

我在这里参加聚会有点晚,但我只想分享我的解决方案:

我遇到了同样的问题,就我而言,等待时间太长,创建新工作人员的效率还不够。

我的解决方案是:

  1. 在工作者中逐步执行任务。
  2. 发回主线程,如果继续,请“询问”。
  3. 主线程以一个标志进行响应,该标志指示我们的工作人员是否应该继续当前任务,或者是否应该中断/重新开始新数据。

工人代码:

self.addEventListener("message", function (e) {

    var args = new Int16Array(e.data);

    if (args[0] === 1) {//Start new task/start over. 

        ExecuteTask(args);
        self.postMessage("CONTINUE?");

    }else if (args[0] === 2) {//Continue 

        ExecuteTask(args);
        self.postMessage("CONTINUE?");
    }else{
       self.postMessage("TASK_TERMINATED");
    }
}

主线程:

myWorker.addEventListener('message', function (e) {
    if (e.data === "CONTINUE?") {

        // ask the worker to start over with new data
        if (newTask) { 
            myWorker.postMessage(newDataMessage);
        }
        //No new tasks. Let the worker know it can continue. 
        else{
            myWorker.postMessage(continueMessage);
        }
    } else if (e.data === "TASK_EXECUTED" || e.data === "TASK_TERMINATED"  ) {
        workerIdle = true; //let main thread know it can execute the next new task instead of queueing it up.
    }                   
});

暂无
暂无

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

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