Является ли сам веб-работник многопоточным? - PullRequest
10 голосов
/ 08 марта 2012

например,


 worker.postMessage(data1);
 worker.postMessage(data2);

А внутри веб-мастера, если предположить, что есть много проблем, с которыми нужно разобраться, worker.postMessage(data2) заблокируется до завершения data1

1 Ответ

6 голосов
/ 08 марта 2012

Один работник выполняет свою задачу в очереди, то есть одну задачу за раз.Попробуйте следующий пример:

<!DOCTYPE html>

<script>

var worker = new Worker('worker.js');
worker.postMessage({ task: 1, iterations: 100 }); // very slow task
worker.postMessage({ task: 2, iterations: 1 }); // very quick task
worker.onmessage = function(event) {
    console.log(event.data);
};

</script>

worker.js:

self.onmessage = function(event) {
    for (var i = 0; i < event.data.iterations * 1000 * 1000 * 10; i++) {};
    self.postMessage("Finished task " + event.data.task);
}

Ouput:

Finished task 1
Finished task 2

Задачи всегда выполняются по порядку, т.е. сначала медленноодин, потом быстрый.(Если бы задача выполнялась параллельно, вторая задача сначала заканчивалась бы с чистым полем.)

(Просто для ясности: вызов postMessage всегда блокируется в контексте выполнения (как любой вызов функции), но эффективно возвращает«немедленно», поскольку отправка самого сообщения - это очень быстрая операция. Вероятно, это не то, что вы просили.)

Примечание. Chrome выдает исключение безопасности, если вы пытаетесь загрузить worker.js с локального диска, работает вSafari & Firefox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...