Domanda

Saluti,

Ho studiato JavaScript, Nodejs. E non capisco come siano evitati i problemi di concorrenza in JavaScript.

Diciamo che sto lavorando su un oggetto

var bigObject = new BigObject();

E ho un setTimer(function(){ workOnBigOjbect...} ) questo funzionerà anche su bigOjbect.

Se ho il disco in cui è stato scritto bigObject, e un oggetto timer a cui lavora bigObject, e la lettura regolarmente in codice da bigObject, Come si evitano i problemi di concorrenza?

In una lingua normale, userei un modello di coda/comando mutex o thread-safe. Inoltre, non vedo molte discussioni sulle condizioni di gara per JavaScript.

Mi sto perdendo qualcosa?

È stato utile?

Soluzione

L'intero punto di Node.js è che è guidato dagli eventi. Tutto il codice viene eseguito nei gestori di eventi in un singolo thread. Non ci sono problemi di concorrenza perché il codice non viene eseguito contemporaneamente. Il rovescio della medaglia è che ogni gestore di eventi deve uscire rapidamente perché blocca gli altri eventi.

Nel tuo esempio, il codice inizierà il disco IO e uscirà immediatamente. L'infrastruttura Node.js notificherà al programma che l'operazione IO è stata completata eseguendo un gestore di eventi. L'evento del timer verrà chiamato prima o dopo l'evento IO, ma mai contemporaneamente.

Altri suggerimenti

JavaScript è singolo. Se arriva il tempo in cui la funzione dovrebbe essere eseguita (in base al modo in cui hai chiamato setTimer) e il codice principale è ancora in esecuzione, la funzione non eseguirà fino al completamento del codice genitore.

C'è un solo thread; vedere: Node.js su macchine multi-core

Vorrei ipotizzare che ciò sia dovuto al fatto che più thread non sono supportati nel motore V8 javascript sottostante poiché in genere JavaScript si esegue all'interno di un browser (dove in un caso di Windows c'è solo un thread UI singolo) e non supporta più thread.

C'è questa cosa in JavaScript chiamata Completamento run-to Il che garantisce che se un codice lo sta eseguendo esegui completamente prima di qualsiasi altro codice (asincrono) esegue, pertanto, nessun problema di concorrenza.

Nel caso del tuo esempio ogni volta che il callback del timer viene chiamato eseguirà completamente e non sarà mai pre-impegnato al centro per eseguire qualche altro codice.

Vedere Perché nessuno strumento di controllo della concorrenza in JavaScript per ulteriori dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top