3

Скажем, у нас есть веб-рабочий, ссылающийся на файл под названием «worker.js». Мы используем работника для выполнения функции в «worker.js», которая выполняет некоторую длительную операцию. Мы вызываем сообщение соответствующего сообщения для рабочего и продолжаем в основном потоке. Однако, прежде чем рабочий закончит свою начальную работу, основной поток отправит ему еще одно сообщение.Публикация сообщения веб-работнику, пока он еще запущен

Мой вопрос: будет ли рабочий продолжать нашу функцию учета времени и обрабатывать только что опубликованное сообщение после завершения или прервет его текущую операцию до тех пор, пока новый не будет завершен?

+0

Hooking https://stackoverflow.com/q/3177774/632951 – Pacerier

ответ

2

Я опробовал следующий код в отладчике Google Chrome:

worker.js:

var cosine; 
self.onmessage = function(e) { 
    if (e.data.message == 0) { 
     for (var i = 0; i < 10000000; i++) { 
      cosine = Math.cos(Math.random()); 
      if (i % 1000 == 0) console.log("hello world"); 
     } 
    } else if (e.data.message == 1) { 
     console.log("xyz"); 
    } 
}; 

main.js:

var worker; 

function main() { 
    worker = new Worker("js/worker.js"); 
    worker.postMessage({message: 0}); 
    setTimeout(xyz, 10); 
} 

function xyz() { 
    worker.postMessage({message: 1}); 
} 

выход:

(10000 times) test.js:11 hello world 
test.js:14 xyz 

Косинус способность пересчитывается с каждой новой итерацией, чтобы обеспечить алгоритм определения времени, описанный в вопросе. По-видимому, сообщение получено только после завершения последней операции, так как я заметил, что выход «xyz» печатается сразу после выхода 10000-го «привет мир».

0

Веб-рабочий поддерживается одной нитью. Это означает, что пока выполняется обработчик «onmessage», он не сможет получить другое событие «onmessage» до тех пор, пока предыдущий не завершит.

Это довольно неудобно, если мы хотим реализовать какой-либо процесс вычисления фона, который мы хотим, чтобы иметь возможность приостанавливать и возобновлять работу, потому что нет способа отправить сообщение «пауза» текущему рабочему. Мы можем остановить веб-исполнителя через worker.terminate(), но это полностью убивает работника.

Единственный способ, которым я могу думать, нарезая выполнение уборщицы на куски, а затем отправить сообщение из работника в конце каждого фрагмента, который затем вызывает сообщение для работника, чтобы обработать следующий фрагмент , и так далее.

Смежные вопросы