JavaScript multi-threaded? [chiuso]

2

Lo so, lo so - non è possibile al momento ma la mia domanda è questa:

Sarebbe possibile scrivere un plug-in del browser per i principali browser che abilita vero, multi-threaded JavaScript?

Sembra proprio che sarebbe possibile e, in tal caso, prenderebbe il web (per non parlare di JavaScript) a nuovi livelli.

    
posta Matt Cashatt 26.04.2013 - 17:54
fonte

2 risposte

9

Il DOM e le sue varie API NON sono thread-safe. Nessun plug-in del browser sarà in grado di renderli thread-safe senza interrompere sostanzialmente il multi-threading puro.

Alcune funzioni DOM come document.getElementsByTagName() sono intrinsecamente thread-safe perché restituiscono una raccolta dinamica che cambia automaticamente quando viene modificato il DOM. Non è nemmeno possibile scorrere in modo sicuro i risultati di tale raccolta se qualche altro thread potrebbe cambiare il DOM contemporaneamente. Una nuova API DOM potrebbe essere scritta pensando alla sicurezza dei thread, ma sarebbe un'impresa importante e alcuni comportamenti esistenti dovrebbero essere interrotti.

Inoltre, i browser moderni hanno già lavoratori del web che consentono il multi-threading in javascript puro (senza Accesso DOM nei thread), quindi dovresti descrivere cosa c'è di più oltre i web worker che non richiedono l'accesso DOM che ti interessa implementare.

    
risposta data 26.04.2013 - 17:55
fonte
3

Brendan Eich ha espresso la sua opposizione al multi-threading in JavaScript più volte:

So my default answer to questions such as the one I got at last May’s Ajax Experience, “When will you add threads to JavaScript?” is: “over your dead body!” (source)

E prosegue elencando alcuni motivi per cui.

Non è solo il DOM che non è thread-safe, il linguaggio stesso non si presta a un aggraziato multithreading. Uno dei grandi problemi che affliggono JavaScript è il sistema di tipo altamente flessibile e dinamico. Poiché quasi tutto può essere modificato e ridefinito in fase di esecuzione, cosa succede quando il programmatore modifica il corpo del metodo Object.prototype.toString mentre un altro thread sta effettivamente chiamando Object.prototype.toString ? O più in generale, qualsiasi metodo? L'unico modo sicuro per gestirli sarebbe sincronizzare qualsiasi operazione che modifichi qualsiasi metodo su qualsiasi oggetto - poiché questo è un compito abbastanza comune in JavaScript, in pratica si ripristinerebbe di nuovo in un linguaggio a thread singolo.

I lavoratori Web sono in grado di aggirare questo problema assicurandosi che gli script di lavoro non condividano lo stesso spazio di memoria del thread principale, quindi la modifica degli oggetti nel lavoro non può interrompere o alterare l'operazione del thread principale.

    
risposta data 26.04.2013 - 20:10
fonte

Leggi altre domande sui tag