2016-12-03 4 views
0

대용량 데이터를 처리하는 웹 작업자를 만들었습니다.동일한 웹 작업자에게 여러 요청을 처리하는 방법

내가 callWorker 여러 번 실행하지 않으려는이 경우

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) 

을 worker.js : 다음 코드 구현입니다. 내가 원하는 것은 callWorker이 현재 실행 중이며 callWorker에 대한 두 번째 요청 발생 중에 첫 번째 요청이 종료되어야하고 두 번째 요청이 처리되어야한다는 것입니다 (최신 요청이 처리되어야 함).

어떻게하면됩니까? 도움을 주셔서 감사합니다

답변

1

작업자를 종료하고 다시 시작할 수 있습니다. terminate 메서드를 호출하면 작업이 끝나기를 기다리지 않고 즉시 종료됩니다.

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

callWorker 현재 실행하고 두 번째 요청에 대한 상향 callWorker 동안 의미 인 경우, 첫 번째 요청을 종료해야하며, 두 번째 요청 (최신 요청 처리 함)으로 처리한다.

작업자를 해지하지 않으면이 작업을 수행 할 수 없습니다. 현재 프로세스를 종료하는 대신, 완료 될 때까지 기다린 후 바로 다음 메시지를 보내야한다고 생각합니다.

0

여기 파티에 조금 늦었 어하지만 난 그냥 내 솔루션을 공유하기를 원해요 :

내가 같은 문제를 가지고 있었고, 내 경우 대기에 너무 오래 걸릴 새로운 직원이 효율적이지이었다 만드는 것 충분히.

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