2

Ok, so I'm working on a code where I start 5 workers, they all sleep for a random time from 0-10 seconds, they then return how long they slept for. the manager then outputs this to the html when all workers are done sleeping

So far I have made my 5 workers, that sleep for random times but don't know how to handle the multiple responses to the manager. worker.js method that gets a random numbers, sleeps for that randomnumber then sends how long it slept manager.js (under)

window.onload = function(){
var w1= new Worker("worker.js");
var w2= new Worker("worker.js");
var w3= new Worker("worker.js");
var w4= new Worker("worker.js");
var w5= new Worker("worker.js");

var worker = [w1,w2, w3, w4, w5]

for (i =0; i < worker.length; i++){

worker[i].postMessage("sleep");

    worker[i].onmessage = function(event) {
         ndate = new Date();
         message = ndate + " Worker says " + event.data;
         document.getElementById("output").innerHTML = message;
         }
}


}

this code has 5 working workers but the message is the message from the last worker. So my question is how do I collect these 5 messages in the manager, wait for all 5 then send to html?

1
  • Can you post your "worker.js"? Commented Nov 25, 2014 at 3:57

3 Answers 3

2

Considering your response to the other answer, this should work.

window.onload = function(){

    var w1= new Worker("worker.js");
    var w2= new Worker("worker.js");
    var w3= new Worker("worker.js");
    var w4= new Worker("worker.js");
    var w5= new Worker("worker.js");

    var worker = [w1,w2, w3, w4, w5];

    var wokenUp = 0;
    var allMessages = "";

    for (i =0; i < worker.length; i++){

        worker[i].onmessage = function(event) {
            ndate = new Date();
            message = ndate + " Worker says " + event.data;

            allMessages += message;
            wokenUp++;

            if (wokenUp == worker.length){
                document.getElementById("output").innerHTML = allMessages;
            }
         }

        worker[i].postMessage("sleep");
    }
}
Sign up to request clarification or add additional context in comments.

Comments

1

Maybe the workers are overwriting the text. Try appending the text:

document.getElementById("output").innerHTML += message;

1 Comment

ok I did that and it looks more like what I'm suppose to get but I want to wait for them all to "wake up" and then output that
0

I would wrap each worker into a Promise then you can do Promise.all() to wait for all of them to complete.

function promiseFromWorker(worker) {
  return new Promise(function(resolve) {
    worker.onmessage = function(event) {
      resolve(event);
    }
  }
}

var w1= new Worker("worker.js");
var w2= new Worker("worker.js");
var w3= new Worker("worker.js");
var w4= new Worker("worker.js");
var w5= new Worker("worker.js");

var worker = [w1,w2, w3, w4, w5];

var promises = worker.map(promiseFromWorker);

Promise.all(promises).then(function(events){
    events.map(function(event) {
         ndate = new Date();
         message = ndate + " Worker says " + event.data;
         document.getElementById("output").innerHTML = message;
    });
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.