Как создать / отправить сообщение веб-работникам в массиве - PullRequest
0 голосов
/ 05 мая 2018

Вопрос прост:

Пример:

For (iterate based on amount of cores){
   Let worker = workers[I]
   Worker.postmessage
}

Конец примера.

Отказ от ответственности: этот пример показывает только то, что ожидается от конечного результата и ни в коем случае не соответствует тому, что считается «рабочим условием». Также обратите внимание, что метод, использованный выше, не возвращает работника для «работников [итератор]», а просто не определен.

Цель: Создать методы работы:

1: создать массив неизвестного количества рабочих (на основе ядер).

2: после создания массива отправьте сообщение каждому работнику и получите возвращаемый результат (кроме неопределенного).

Примечание: у меня есть гипотеза о том, почему это не работает:

1: веб-работники создаются и доступны только через событие, которое их создало, и его единственным приемом является обработчик «события» onmessage.

  • вопреки моей гипотезе есть такие вещи, которые скажут «ржать» над тем, что написано выше, например, thread.js, который допускает пул потоков и другие процедуры.

Это основная причина, почему я спрашиваю, потому что я знаю, что это возможно, но хотел бы получить простой ответ.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 05 мая 2018

Вот пример:

function createWorker (workerScript) {
    const blob = new Blob([`(${workerScript})(self)`], {type: 'application/javascript'});
    return new Worker(URL.createObjectURL(blob));
};

function workerCode (self) {
    self.onmessage = function (message) {
        postMessage(`Data from worker: ${message.data}`);
    };
};

// assuming that you will send only one message to the worker,
// and that the worker will produce only one message too.
function workerPromise (worker, message) {
    const promise = new Promise((resolve, reject) => {
        worker.onmessage = resolve;
    }).then(message => message.data);
    worker.postMessage(message);
    return promise;
}

(async () => {
    const workers = [];
    for (let i = 0; i < navigator.hardwareConcurrency; i++) {
        workers.push(createWorker(workerCode));
    }

    const results = await Promise.all(
        workers.map((w, index) => workerPromise(w, `worker ${index}`))
    );

    console.log(results);
})();
...