trabajadores Web - ¿Cómo funcionan?
-
04-10-2019 - |
Pregunta
Estoy tratando de entender este ejemplo :
HTML (código principal):
<html>
<title>Test threads fibonacci</title>
<body>
<div id="result"></div>
<script language="javascript">
var worker = new Worker("fibonacci.js");
worker.onmessage = function(event) {
document.getElementById("result").textContent = event.data;
dump("Got: " + event.data + "\n");
};
worker.onerror = function(error) {
dump("Worker error: " + error.message + "\n");
throw error;
};
worker.postMessage("5");
</script>
</body>
</html>
Javascript (código de trabajador):
var results = [];
function resultReceiver(event) {
results.push(parseInt(event.data));
if (results.length == 2) {
postMessage(results[0] + results[1]);
}
}
function errorReceiver(event) {
throw event.data;
}
onmessage = function(event) {
var n = parseInt(event.data);
if (n == 0 || n == 1) {
postMessage(n);
return;
}
for (var i = 1; i <= 2; i++) {
var worker = new Worker("fibonacci.js");
worker.onmessage = resultReceiver;
worker.onerror = errorReceiver;
worker.postMessage(n - i);
}
};
Tengo las siguientes preguntas:
-
Cuando exactamente los códigos trabajador comienza a correr? Inmediatamente después de la ejecución de
var worker = new Worker("fibonacci.js");
? -
¿Es cierto que la asignación
onmessage = function(event) { ... }
en el código trabajador será ejecutado antesworker.postMessage("5");
en el código principal? -
Puede trabajador código de acceso variables globales que se definen en el código principal (como
worker
)? -
puede tener acceso a código principal variables globales que se definen en el código de trabajador (como
results
)? -
Me parece que
worker.onmessage = function(event) {...}
en el código principal tiene el mismo significado comoonmessage = function(event) {...}
en el código trabajador (que es controlador de eventosonmessage
del trabajador). ¿Dónde estoy mal? ¿Cuál es la diferencia entre ellos? -
Lo que este código debe hacer realmente? Cuando lo ejecuto aquí que sólo imprime "5". Es eso lo que se supone que hacer, o que estoy perdiendo algo?
Muchas gracias!
Solución
HTML5 Rocks: Los fundamentos de la Web Workers para tutorial en general <. / p>
- Los trabajadores se iniciará tan pronto como se llama al método
postMessage
del trabajador. - la función obligado a
onmessage
del trabajador en el código principal funcionará cuando el trabajador llamapostMessage
. - variables globales no se comparten entre principales y subprocesos de trabajo. La única manera de pasar datos es a través de mensajería a través de
postMessage
. - Como se sospechaba, el
onmessage
en tanto el código de los trabajadores y principal tiene el mismo significado. Se trata de un controlador de eventos para cuando el hilo recibe un suceso de mensaje. Incluso puede utilizaraddEventListener
lugar, la captura de eventosmessage
:
Código principal:
function showResult(event) {
document.getElementById("result").textContent = event.data;
dump("Got: " + event.data + "\n");
}
var worker = new Worker("fibonacci.js");
worker.addEventListener('message', showResult, false);
Código Trabajador:
addEventListener('message', resultReceiver, false);
El ejemplo de Fibonacci que tomó es un ejemplo trabajador recursiva. Si no utiliza los trabajadores, sería algo como esto:
function fibonacci(n) {
if (n == 0 || n == 1) return n;
return fibonacci(n-1) + fibonacci(n-2);
}
var result = fibonacci(5);
dump("Got: " + result + "\n");
(oh, no, no voy a hacer sin pérdida de velocidad para usted. Usted escribe usted mismo!)
Otros consejos
También quiero añadir que puede depuración trabajadores web sólo en los navegadores basados ??en cromo. Tiene que seleccionar Fuentes en el panel de desarrollador y en la columna de la derecha ampliar línea de fondo Trabajadores y luego seleccione la casilla de verificación pausa en el arranque .