2012-03-08 15 views
8

p. Ej.¿Es el propio webworker multi-hilo?

 

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

Y dentro de la webwoker, suponiendo que no hay cantidad de cuestiones que deben tratar, haría worker.postMessage(data2) bloque antes de completar el data1

+0

¿Qué tarea realiza su trabajador? ¿Cálculo? Ajax? –

Respuesta

5

Un solo trabajador ejecuta su tarea en la cola, es decir, una tarea a la vez. Prueba el siguiente ejemplo:

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

Las tareas se siempre terminadas en orden, es decir primero la lenta, entonces el uno rápida . (Si la tarea se ejecutó en paralelo, la segunda tarea terminaría primero con un margen claro.)

(Para que quede claro: llamar a postMessage siempre bloquea en su contexto de ejecución (como cualquier llamada de función) pero efectivamente devuelve "inmediatamente ", porque publicar el mensaje en sí es una operación muy rápida. Probablemente eso no sea lo que usted pidió.)

Nota: Chrome arroja una excepción de seguridad si intenta cargar el archivo worker.js desde el disco local, funciona en Safari & Firefox.