2015-05-25 10 views
5

Ho utilizzato i web-worker in javascript. Sarebbe stata una ciliegina sulla torta se la finestra, i riferimenti dei documenti fossero presenti nel contesto dei web worker. Mi piacerebbe sapere per quale motivo è stato scelto per non rendere questi riferimenti accessibili ai lavoratori?Perché i web worker non danno accesso all'oggetto DOM?

Inoltre c'è qualche soluzione per utilizzare questi riferimenti?

risposta

5

JavaScript standard e l'API DOM non hanno assolutamente alcun meccanismo di esclusione che consente a più thread di accedere in sicurezza agli stessi oggetti.

La soluzione scelta più spesso per consentire il multitasking in JavaScript consiste nell'isolare i thread e consentire loro di scambiarsi tramite messaggi (o eventi). Dare accesso al DOM ai webworkers spezzerebbe quell'isolamento.

Si noti che questo non è completamente specifico per JavaScript: quasi tutti i framework GUI, indipendentemente dalla lingua, limitano le modifiche della GUI a un thread dedicato. JavaScript è più restrittivo poiché il più delle volte (sempre nel browser) non è possibile condividere oggetti.

La soluzione semplice consiste nel consentire al thread principale del browser di apportare le modifiche necessarie, quando il thread in background fornisce le istruzioni through messages. O meglio: esegui solo le numerose attività della CPU nel webworker, lasciando che il thread principale ottenga i dati di input e aggiorni il DOM quando il webworker invia i dati di output.

+1

Va notato che è molto semplice rallentare il programma utilizzando mutex e blocchi (il problema comune "perché il mio programma multithread è più lento"). Il modo per velocizzare i programmi di memoria condivisa è quello di strutturare il codice in modo che raramente tocchi i blocchi di scrittura. Sfortunatamente, i programmi GUI tendono a modificare molto lo schermo. Ciò significa che rendere il sottosistema dell'interfaccia utente multithreaded tenderà a rendere il programma molto più lento di un programma con un solo thread. Il messaggio che passa costringe i programmatori a disciplinarsi per non scrivere sul DOM da più thread. – slebetman