2011-12-01 11 views
9

Sto sperimentando con i web worker e mi stavo chiedendo come avrebbero affrontato problemi imbarazzanti. Ho quindi implementato Connaway's Game of Life. (Per avere un po 'più divertimento che fare una sfocatura, o qualcosa del genere.)Come eseguire la comunicazione da lavoratore a lavoratore?

Al momento ho un web worker che esegue iterazioni e postback di nuovo ImageData per il thread dell'interfaccia utente mettere nella mia tela. Funziona bene.

Tuttavia, il mio esperimento non finisce qui, perché ho a disposizione diverse CPU e vorrei parallelizzare la mia applicazione.

Quindi, per iniziare semplicemente ho diviso i miei dati in due, nel mezzo, e ho fatto due lavoratori ciascuno che si occupavano di metà ciascuno. Il problema è ovviamente la scissione. Il lavoratore A ha bisogno di una colonna di pixel dal lavoratore B e viceversa. Ora, posso chiaramente risolvere questo problema lasciando che il mio thread dell'interfaccia utente dia quella colonna ai lavoratori, ma sarebbe molto meglio se i miei thread potessero passarli direttamente a ciascuno.

Al momento di suddividere ulteriormente, ogni lavoratore dovrebbe solo tenere traccia dei propri lavoratori vicini e il thread dell'interfaccia utente sarebbe solo responsabile dell'aggiornamento dell'interfaccia utente (come dovrebbe essere).

Il mio problema è che non vedo come posso ottenere questa comunicazione da lavoratore a operatore. Ho provato a passare i vicini a vicenda tramite un post-messaggio di inizializzazione, ma questo avrebbe copiato il mio lavoratore piuttosto che consegnare un riferimento, che per fortuna chrome mi ha avvertito dell'essere impossibile.

Uncaught Error: DATA_CLONE_ERR: DOM Exception 25 

Finalmente vedo che c'è qualcosa chiamato un SharedWorker. È questo che dovrei esaminare, oppure esiste un modo per utilizzare lo Worker che risolverebbe il mio problema?

risposta

5

Si dovrebbe essere in grado di utilizzare channel messaging:

var channel = new MessageChannel(); 
worker1.postMessage({code:"port"}, [channel.port1]); 
worker2.postMessage({code:"port"}, [channel.port2]); 

Poi, nel tuo thread di lavoro:

var xWorkerPort; 
onmessage = function(event) { 
    if (event.data.code == "port") { 
     xWorkerPort = event.ports[0]; 
     xWorkerPort.onmessage = function(event) { /* do stuff */ }; 
    } 
} 

Non c'è molta documentazione in giro, ma si potrebbe provare this MS summary per iniziare.

+0

Grazie per la tua risposta @robertc, mi ero completamente dimenticato di questo. Immagino che dovrei passare un po 'di tempo su questo. – Mithon

+0

in che modo il canale del messaggio è utile per la comunicazione di lavoro –

+0

Questo non funzionerà in Firefox fino a quando questo bug non verrà rilasciato: https://bugzilla.mozilla.org/show_bug.cgi?id=911972 – Adria

Problemi correlati