2012-03-08 4 views
8

, например.Является ли webworker сам многопоточным?

 

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

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

+0

Какую задачу выполняет ваш рабочий? Исчисление? Ajax? –

ответ

5

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

<!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 выдает исключение безопасности, если вы пытаетесь загрузить work.js с локального диска, работает в Safari & Firefox.