2010-07-09 21 views
5

Por favor, considere el siguiente código y la explicación de este tutorial Mozilla "Using web workers":¿Condición de carrera con los trabajadores de la web al configurar el controlador de mensajes?

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

línea 1 en este ejemplo crea y comienza a funcionar el subproceso de trabajo. La línea 2 establece el controlador onmessage para el trabajador en una función que es llamada cuando el trabajador llama a su propia función postMessage().

El hilo se inicia en el momento en que el trabajador se llama al constructor. Me pregunto si podría haber una condición de carrera al configurar el controlador onmessage. Por ejemplo, si el trabajador web publica un mensaje antes de configurar onmessage.

¿Alguien sabe más acerca de esto?

Actualización:

Andrey señaló que el trabajador web debe comenzar su labor, cuando se recibe un mensaje, al igual que en el ejemplo de Fibonacci en el tutorial de Mozilla. ¿Pero eso no crea una nueva condición de carrera al configurar el controlador onmessage en el trabajador web?

Por ejemplo:

El script principal:

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

El guión trabajador web ('') worker.js

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

Y luego considerar la siguiente ruta de ejecución:

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

Th e "var result = []" se puede omitir la línea, seguirá teniendo el mismo efecto.

Y esta es una ruta de ejecución válida, ¡la probé configurando un tiempo de espera en el trabajador web! Por el momento no puedo ver, ¿cómo usar web workers sin correr en condiciones de carrera?

Respuesta

3

La respuesta es que tanto el script principal y el trabajador web, tienen una cola deMessagePort que recoge los mensajes antes de que el guión inicial trabajador regresa .

Para más detalles, consulte este tema en la lista de correo de ayuda WHATWG: http://lists.whatwg.org/pipermail/help-whatwg.org/2010-August/000606.html

+0

El enlace a la lista de correo ahora está roto. Alguna idea de dónde leer el hilo o, alternativamente, ¿hubo algún problema? – HRJ

+0

@HRJ Lo siento, no puedo encontrar una versión archivada del hilo. Pero no hay trampas, una cola de mensajes se asegura de que no tenga que preocuparse por las condiciones de carrera. – tsauerwein

2

Sí, es posible causar condiciones de carrera aquí. La responsabilidad recae en el desarrollador de Worker. Debería comenzar a publicar mensajes solo después de recibir el mensaje a través de postMessage(). En el constructor solo debe hacer la inicialización, pero no el procesamiento real. En la sección de ejemplos de su página, hay una buena muestra sobre los números de fibonachi. Mire su estructura, el trabajo real comienza cuando se recibe el mensaje. Sigue ese patrón.

+2

¿Qué pasa si el hilo principal envía su mensaje de inicio, antes de que el trabajador web ha establecido su manejador onmessage? ¿Es eso posible? – tsauerwein

Cuestiones relacionadas