2010-07-09 11 views
5

Proszę rozważyć następujący kod i wyjaśnienia od tego tutoriala Mozilla "Using web workers":Warunki wyścigu z pracownikami WWW podczas ustawiania obsługi wiadomości?

var myWorker = new Worker('my_worker.js'); 
myWorker.onmessage = function(event) { 
    print("Called back by the worker!\n"); 
}; 

Linia 1 w tym przykładzie tworzy i uruchamia wątek pracowników. Linia 2 ustawia moduł obsługi wiadomości dla pracownika na funkcję, która jest wywoływana, gdy pracownik wywołuje własną funkcję postMessage().

Wątek jest uruchamiany w momencie wywołania konstruktora Worker. Zastanawiam się, czy może istnieć warunek wyścigu na ustawienie obsługi onmessage. Na przykład, jeśli pracownik WWW wysyła wiadomość przed ustawieniem onmessage.

Czy ktoś wie o tym więcej?

Aktualizacja:

Andrey wskazał, że pracownik internetowej powinny rozpocząć swoją pracę, gdy odbiera wiadomość, jak na przykład Fibonacciego w samouczku Mozilla. Ale czy to nie tworzy nowego warunku wyścigu podczas ustawiania procedury obsługi komunikatów w mechanizmie WWW?

Na przykład:

Głównym scenariusz:

var myWorker = new Worker('worker.js'); 
myWorker.onmessage = function(evt) {..}; 
myWorker.postMessage('start'); 

Skrypt pracownik internetowej ('worker.js')

var result = []; 
onmessage = function(evt) {..}; 

a następnie rozważyć następującą ścieżkę wykonanie:

main thread         web worker 
var worker = new Worker("worker.js"); 
              var result = []; 
myWorker.onmessage = .. 
myWorker.postMessage('start'); 
              onmessage = .. 

Th e "var result = []" linia może zostać pominięta, nadal będzie ten sam efekt.

I to jest poprawna ścieżka wykonywania, próbowałem go przez ustawienie limitu czasu w przeglądarce internetowej! W tej chwili nie widzę, jak korzystać z pracowników internetowych bez wpadania w warunki wyścigowe ?!

Odpowiedz

3

Odpowiedź jest, że zarówno główny scenariusz i pracownik internetowej mają MessagePort kolejkę które zbiera wiadomości przed początkowy scenariusz pracownik zwraca.

uzyskać szczegółowe informacje, zobacz ten wątek na liście WHATWG pomocy korespondencji: http://lists.whatwg.org/pipermail/help-whatwg.org/2010-August/000606.html

+0

Link do listy mailingowej jest teraz uszkodzony. Każdy pomysł, gdzie przeczytać wątek, lub na przemian, były jakieś garsony? – HRJ

+0

@ HRJ Niestety, nie mogę znaleźć zarchiwizowanej wersji wątku. Ale nie ma gotcha, kolejka wiadomości zapewnia, że ​​nie musisz się martwić o warunki wyścigu. – tsauerwein

2

Tak, możliwe jest spowodowanie tutaj stanu wyścigu. Odpowiedzialność spoczywa na twórcy oprogramowania Worker. Powinien zacząć publikować wiadomości tylko po otrzymaniu wiadomości przez . W konstruktorze musi wykonywać tylko inicjalizację, ale nie rzeczywiste przetwarzanie. W sekcji Przykłady na twojej stronie znajduje się niezła próbka o liczbach fibonachi. Spójrz na jego strukturę, prawdziwa praca zaczyna się po otrzymaniu wiadomości. Wykonaj ten wzór.

+2

Co jeżeli wątek główny wysyła komunikat startowy, zanim pracownik internetowej ustawił swój onmessage obsługi? Czy to jest możliwe? – tsauerwein

Powiązane problemy