Web Workers HTML5
Web Workers HTML5
Estos Web workers se ejecutan en un subproceso aislado. Como resultado, es necesario que el
código que ejecutan se encuentre en un archivo independiente. Sin embargo, antes de hacer
esto, lo primero que se tiene que hacer es crear un nuevo objeto Worker en la página principal:
A continuación, se muestra un ejemplo sobre cómo utilizar una cadena para transferir "Hello
World" a un Worker en doWork.js . El Worker simplemente devuelve el mensaje que se le
transfiere.
Secuencia de comandos principal:
self.addEventListener('message', function(e) {
self.postMessage(e.data);
}, false);
Los mensajes que se transfieren entre el origen y los Worker se copian, no se pasan por
referencia. Por ejemplo, en el siguiente ejemplo, a la propiedad msg del mensaje JSON se
accede en las dos ubicaciones. Parece que el objeto se transfiere directamente al Worker
aunque se esté ejecutando en un espacio específico e independiente. En realidad, lo que ocurre
es que el objeto se serializa al transferirlo al Worker y, posteriormente, se anula la
serialización en la otra fase del proceso. El origen y el Worker no comparten la misma
instancia, por lo que el resultado final es la creación de un duplicado en cada transferencia. La
mayoría de los navegadores implementan esta función mediante la codificación/
descodificación JSON automática del valor en la otra fase del proceso, cuando el paso de
objetos está soportado.
<script>
function sayHI() {
worker.postMessage({'cmd': 'start', 'msg': 'Hi'});
}
function stop() {
worker.postMessage({'cmd': 'stop', 'msg': 'Bye'});
}
function unknownCmd() {
worker.postMessage({'cmd': 'foobard', 'msg': '???'});
}
worker.addEventListener('message', function(e) {
document.getElementById('result').textContent = e.data;
}, false);
</script>
doWork.js:
this.addEventListener('message', function(e) {
var data = e.data;
switch (data.cmd) {
case 'start':
this.postMessage('WORKER STARTED: '+data.msg);
break;
case 'stop':
this.postMessage('WORKER STOPPED: '+data.msg+'. (buttons wil
l no longer work)');
this.close(); // Terminates the worker.
break;
default:
this.postMessage('Unknown command: '+data.msg);
};
}, false);
Crear nuevo Worker es muy sencillo. Tan sólo tenemos que crear una nueva instancia del
objeto Worker , indicando como parámetro del constructor el fichero JavaScript que contiene
el código que debe ejecutar el Worker.
De esta manera tenemos disponible y listo para utilizar un nuevo Worker. En este momento,
podríamos pensar que podemos llamar a métodos o utilizar objetos definidos dentro del
nuevo Worker, pero no nada más lejos de la realidad. La única manera de comunicarnos con el
nuevo Worker es a través del paso de mensajes, como hemos visto anteriormente.
worker.postMessage('Hello World');
Éste método únicamente acepta un parámetro, la cadena de texto a enviar al Worker. Por otra
parte, la manera de recibir mensajes originados en el Worker es definiendo un escuchador
para el evento message . Los datos incluidos por el Worker se encuentran disponibles en la
propiedad data del evento.
worker.addEventListener('message', function(e) {
alert(e.data);
}, false);
this.addEventListener('message', function(e) {
postMessage("I'm done!");
});
• WebSockets .
• EventSource .
• Web Workers .
• Objeto window .
• Objeto document .
• Objeto parent .
12.3 SUBWORKERS
Los Workers tienen la capacidad de generar Workers secundarios. Esto significa, que podemos
dividir la tarea principal en subtareas, y crear nuevos Workers dentro del Worker principal. Sin
embargo, a la hora de utilizar los Subworkers, y antes de poder devolver el resultado final al
hilo principal, es necesario asegurarse que todos los procesos han terminado.
pendingWorkers--;
if (pendingWorkers <= 0) {
postMessage(JSON.stringify(results));
}
}
<script>
function onError(e) {
document.getElementById('error').textContent = [
'ERROR: Line ', e.lineno, ' in ', e.filename, ': ', e.message].j
oin('');
}
function onMsg(e) {
document.getElementById('result').textContent = e.data;
}
</script>
workerWithError.js:
self.addEventListener('message', function(e) {
postMessage(1/x); // Intentional error.
};
12.5 SEGURIDAD
Debido a las restricciones de seguridad de Google Chrome (otros navegadores no aplican esta
restricción), los Workers no se ejecutarán de forma local (por ejemplo, desde file:// ) en las
últimas versiones del navegador. En su lugar, fallan de forma automática. Para ejecutar tu
aplicación desde el esquema file:// , ejecuta Chrome con el conjunto de marcadores --
allow-file-access-from-files .
Las secuencias de comandos del Worker deben ser archivos externos con el mismo esquema
que su página de llamada. Por ello, no se puede cargar una secuencia de comandos desde una
URL data: o una URL javascript: . Asimismo, una página https: no puede iniciar
secuencias de comandos de Worker que comiencen con una URL http: .
Ejercicio 14
Ver enunciado
ÍNDICE DE CONTENIDOS
Web workers
12.3 Subworkers
12.5 Seguridad