2016-02-01 3 views
2

Мой JS код основного потока:О Web Workers параллельности

$('body').on('click',function(){alert('click');}); 
var worker = new Worker('worker.js'); 
worker.addEventListener('message', function(e) {  
     console.log(e.data); 
}); 

и код внутри worker.js

var n = 1; 
while (true) { 
    n++; 
    postMessage(n); 
} 

Я только начал изучать о Web workers. Они должны не блокировать пользовательский интерфейс и позволить вам взаимодействовать с ним, в то время как они (рабочие) работают в отдельном потоке, чтобы реализовать параллелизм. На практике то, что я получаю при запуске вышеуказанного кода, - это застрявший браузер без ответа на любой щелчок. Работник работает путем вывода чисел, однако где параллелизм и независимость пользовательского интерфейса?

Я ждётельно для хорошего объяснения.

Спасибо

+0

Работники Сети не имеют разделяемой памяти с основным потоком, поэтому каждый раз, когда вы передаете данные между ними, потоки должны приостанавливаться до тех пор, пока принимающая сторона не ответит. –

ответ

1

Вы наводняете основной поток сообщениями, отправленными от рабочего, через postMessage(). Вероятно, они прибывают быстрее, чем могут отправлять их и записывать в них, тем самым не оставляя другого времени для основного потока. Измените ваши вызовы postMessage, чтобы он только отправил обновление в основной поток, когда прошло 500 мс, и вы не будете перегружать основной поток, позволяя ему делать другие вещи между сообщениями.

Например, попробуйте это в worker.js:

var n = 1; 
var lastSend = Date.now(); 
var now; 
while (true) { 
    n++; 
    now = Date.now(); 
    if (now - lastSend > 500) { 
     lastSend = now; 
     postMessage(n); 
    } 
} 

И это будет только делать PostMessage из Lastest рассчитывать каждые 500 мс, чтобы не перегружать основной поток пытается обработать все эти сообщения.

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

2

Выполненная работа внутри веб-работник ничего в главном потоке не будет блокировать.

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

аналогия:

Для того, чтобы попасть на что-то более важным, Алиса попросила Боба считать 1000 для нее.

Если бы Боб просто молчал до 1000, то все было бы здорово.

К сожалению, она попросила его рассказать ей каждый раз, когда он рассчитывал на новый номер.

"Алиса! Алиса! Алиса!"

«Что такое Боб?»

"1!"

"Алиса! Алиса! Алиса!"

«Что такое Боб?»

"2!"

(NB: На самом деле, это было бы асинхронным: Боб будет держать подсчет и просто быть толкая постоянно длиннее очереди чисел в Алисе, которые нужно было бы читать сообщения и глядя на цифры)

Веб-работники для долгосрочные операции. Ваша операция длится недолго, она должна разговаривать с основной нитью каждый раз, когда она проходит очень короткий цикл.

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