Рассмотрите следующий код и объяснение из этого учебного руководства Mozilla "Используя веб-рабочих":
var myWorker = new Worker('my_worker.js');
myWorker.onmessage = function(event) {
print("Called back by the worker!\n");
};
Строка 1 в этом примере создает и начинает выполнять рабочий поток. Строка 2 набора onmessage обработчик для рабочего к функции, которая вызвана, когда рабочий называет ее собственное постсообщение () функцией.
Поток запускается в момент, конструктора Рабочего вызывают. Интересно, могло ли быть состояние состязания при установке onmessage обработчика. Например, если веб-рабочий добавляет сообщение, прежде чем onmessage будет установлен.
Кто-то знает больше об этом?
Обновление:
Andrey указал, что веб-рабочий должен запустить его работу, когда она получает сообщение, как в примере Fibonacci в учебном руководстве Mozilla. Но разве который не создает новое состояние состязания при установке onmessage обработчика в веб-рабочем?
Например:
Основной сценарий:
var myWorker = new Worker('worker.js');
myWorker.onmessage = function(evt) {..};
myWorker.postMessage('start');
Веб-сценарий рабочего ('worker.js')
var result = [];
onmessage = function(evt) {..};
И затем рассмотрите следующий путь выполнения:
main thread web worker
var worker = new Worker("worker.js");
var result = [];
myWorker.onmessage = ..
myWorker.postMessage('start');
onmessage = ..
"Результат var = []" строка может быть не учтен, это все еще будет тот же эффект.
И это - допустимый путь выполнения, я испытал его путем установки тайм-аута в веб-рабочем! В данный момент я не вижу, как использовать веб-рабочих, не сталкиваясь с условиями состязания?!