Oltre ai Web Worker che abbiamo analizzato, le specifiche prevedono un altro tipo di worker: gli Shared Worker.
I worker che abbiamo visto finora, detti anche Dedicated Worker, hanno una relazione diretta con il thread e/o lo script che li hanno generati, cioè con essi può interagire soltanto il thread che li ha generati. Gli Shared Worker, invece, possono comunicare con tutti gli script che condividono la stessa origine, cioè tutti gli script appartenenti ad uno stesso sito o applicazione Web.
Esaminiamo questo elemento con dei semplici esempi. Per creare uno Shared Worker utilizziamo il costruttore SharedWorker()
:
var myWorker = new SharedWorker("worker.js");
L'interazione del thread principale con il worker condiviso avviene tramite una porta di comunicazione dedicata accessibile tramite la proprietà port:
myWorker.port.postMessage("start");
myWorker.port.onmessage = function(event) { ... };
Analogamente, dal lato worker è possibile comunicare con il thread principale tramite l'evento connect, che si verifica al momento della creazione dell'istanza del worker:
self.addEventListener("connect", function(event) {
var clientPort = event.source;
clientPort.onmessage = function(event) {
var dati = event.data;
//elaborazione di dati
clientPort.postMessage("Dati elaborati");
};
});
Come possiamo vedere dall'esempio, l'oggetto event mette a disposizione la proprietà source
che rappresenta la porta tramite cui comunicare con il thread principale.
Gli Shared Worker rappresentano una evoluzione dei worker dedicati e, se ben utilizzati, possono contribuire ad un migliore utilizzo delle risorse. Possono, ad esempio, essere impiegati in quelle situazioni in cui si ha necessità di condividere una determinata elaborazione o per mantenere uno stato condiviso tra pagine Web diverse.