2012-03-08 8 views
8

np.Czy webworker jest wielowątkowy?

 

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

i wewnątrz webwoker, zakładając tam ilość spraw do czynienia, by worker.postMessage(data2) blok przed zakończeniem data1

+0

Jakie zadanie wykonuje pracownik? Obliczenie? Ajax? –

Odpowiedz

5

Pojedynczy pracownik wykonuje swoje zadania w kolejce, to znaczy jedno zadanie na raz. Spróbuj następujący przykład:

<!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 

Zadania są zawsze wykończone w kolejności, czyli najpierw powolny jeden, potem szybki jeden . (Jeśli zadanie zostało wykonane równolegle, drugie zadanie zakończyłoby się najpierw z wyraźnym marginesem.)

(Tylko dla jasności: wywołanie postMessage zawsze blokuje w swoim kontekście wykonania (jak każde wywołanie funkcji), ale skutecznie zwraca "natychmiast .”, ponieważ zaksięgowania samej wiadomości jest bardzo szybkie działanie to nie jest chyba to, co prosiłeś)

. Uwaga: Chrome rzuca wyjątek zabezpieczeń, jeśli starają się załadować worker.js z lokalnego dysku, pracuje w Safari & Firefox.

Powiązane problemy