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

Javascript 如何处理对同一Web Worker的多个请求,javascript,html,web-worker,Javascript,Html,Web Worker,我创建了一个处理大量数据的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

我创建了一个处理大量数据的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);
在这种情况下,我不想多次执行
callWorker
。 我想要的是,如果
callWorker
当前正在执行,并且意味着当为
callWorker
发出第二个请求时,第一个请求应该终止,第二个请求应该处理(最新的请求应该处理)


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

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

myWorker.terminate();
myWorker = new Worker('worker.js');
如果callWorker当前正在执行,并且意味着第二个请求会引发callWorker,那么第一个请求应该终止,第二个请求应该处理(最新的请求应该处理)


如果不解雇工人,恐怕你无法做到这一点。与其尝试终止当前进程,我认为您应该等到进程完成后再发送下一条消息。

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

我也有同样的问题,在我的情况下,等待时间太长,创建新员工的效率不够

我的解决办法是:

  • 以递增的方式在worker中执行任务
  • 发回主线程并“询问”它是否应该继续
  • 主线程用一个标志来响应,该标志指示我们的工作者是否应该继续当前任务,或者它是否应该中断/重新开始新的数据 工人代码:

    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.
        }                   
    });
    
    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.
        }                   
    });