2010-07-09 12 views
5

Bitte beachten Sie die folgenden Code und die Erklärung von diesem Mozilla Tutorial "Using web workers":Race-Condition mit Web-Worker beim Einrichten eines Nachrichtenhandlers?

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

Linie 1 in diesem Beispiel erzeugt und den Worker-Thread laufen beginnt. Zeile 2 legt den onmessage-Handler für den Worker zu einer Funktion fest, die aufgerufen wird, wenn der Worker seine eigene postMessage() - Funktion aufruft.

Der Faden wird der Worker Konstruktor aufgerufen in dem Moment gestartet. Ich frage mich, ob es eine Race-Condition bei der Einstellung der onMessage Handler geben könnte. Wenn beispielsweise der Web-Mitarbeiter eine Nachricht einreicht, wird eine Nachricht gesetzt.

Weiß jemand mehr darüber?

Update:

Andrey wies darauf hin, dass der Web-Arbeiter seine Arbeit aufnehmen soll, wenn es eine Nachricht empfängt, wie in dem Fibonacci-Beispiel in den Mozilla-Tutorial. Aber schafft das nicht eine neue Race-Bedingung beim Setzen des On-Messaging-Handlers im Web-Worker?

Zum Beispiel:

Das Hauptskript:

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

Der Web-Worker-Skript ('worker.js')

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

Und dann sollten Sie die folgenden Ausführungspfad:

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

Th e "var result = []" Zeile kann weggelassen werden, es wird immer noch der gleiche Effekt sein.

Und dies ist ein gültiger Ausführungspfad, habe ich es ausprobiert, indem Sie eine Zeitüberschreitung im Web Worker setzen! Im Moment kann ich nicht sehen, wie ich Webarbeiter benutze, ohne in Rennbedingungen zu geraten ?!

Antwort

3

Die Antwort ist, dass sowohl das Hauptskript und die Web-Arbeiter haben eine Message Warteschlange, die die Nachrichten, bevor das Skript gibtAnfangs Arbeiter sammelt.

Einzelheiten finden Sie in diesem Thread auf der WHATWG Hilfe Mailingliste: http://lists.whatwg.org/pipermail/help-whatwg.org/2010-August/000606.html

+0

Der Link zur Mailingliste ist jetzt unterbrochen. Irgendeine Idee, wo man den Faden oder abwechselnd lesen konnte, gab es irgendwelche Schwierigkeiten? – HRJ

+0

@HRJ Ich kann keine archivierte Version des Threads finden. Aber es gibt keine Probleme, eine Nachrichtenwarteschlange sorgt dafür, dass Sie sich keine Sorgen um die Rennbedingungen machen müssen. – tsauerwein

2

Ja, hier ist es möglich, einen Race Condition zu verursachen. Die Verantwortung liegt beim Entwickler Worker. Es sollte beginnen, Nachrichten nur zu veröffentlichen, nachdem es Nachricht über postMessage() empfängt. Im Konstruktor muss es nur initialisieren, aber nicht wirklich verarbeiten. Im Beispielbereich von Ihrer Seite gibt es eine schöne Probe über Fibonachi-Zahlen. Schauen Sie sich die Struktur an, die eigentliche Arbeit beginnt mit dem Empfang der Nachricht. Folge diesem Muster.

+2

Was passiert, wenn der Haupt-Thread Nachricht seinen Anfang sendet, bevor die Bahn Arbeiter seine onmessage Handler gesetzt hat? Ist das möglich? – tsauerwein

Verwandte Themen