Пожалуйста, рассмотрите следующий код и объяснение из этого урока Mozilla «Использование веб-работников» :
var myWorker = new Worker('my_worker.js');
myWorker.onmessage = function(event) {
print("Called back by the worker!\n");
};
Строка 1 в этом примере создает и запускаетзапуск рабочего потока. Строка 2 устанавливает обработчик onmessage для работника в функцию, которая вызывается, когда работник вызывает свою собственную функцию postMessage ().
Поток запускается в данный моментвызывается конструктор Worker .Интересно, может ли быть состояние гонки при установке обработчика onmessage .Например, если веб-работник отправляет сообщение до того, как установлено onmessage .
Кто-нибудь знает об этом больше?
Обновление:
Андрей указал, что веб-работник должен начать свою работу, когда он получит сообщение, как в примере Фибоначчи в учебном пособии по Mozilla.Но разве это не создает новое условие гонки при установке обработчика сообщений в веб-работнике?
Например:
Основной сценарий:
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 result = [] "линия может быть опущена, это все равно будет тот же эффект.
И это правильный путь выполнения, я опробовал его, установив таймаут в веб-работнике!На данный момент я не вижу, как использовать веб-работников, не сталкиваясь с гоночными условиями?!