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?
Grazie per la tua risposta @robertc, mi ero completamente dimenticato di questo. Immagino che dovrei passare un po 'di tempo su questo. – Mithon
in che modo il canale del messaggio è utile per la comunicazione di lavoro –
Questo non funzionerà in Firefox fino a quando questo bug non verrà rilasciato: https://bugzilla.mozilla.org/show_bug.cgi?id=911972 – Adria