Pregunta

Saludos,

He estado estudiando JavaScript, NodeJs. Y no entiendo cómo se evitan los problemas de concurrencia en JavaScript.

Digamos que estoy trabajando en un objeto

var bigObject = new BigObject();

Y tengo un setTimer(function(){ workOnBigOjbect...} ) que también funcionará en bigOjbect.

Si tengo el disco que se escribe en bigObject, y un objeto de temporizador que trabaja en bigObject, y codificar regularmente la lectura de bigObject, ¿Cómo se evitan los problemas de concurrencia?

En un idioma regular, usaría un patrón de mutex o hilo seguro para colas/comando. Tampoco veo mucha discusión sobre las condiciones de carrera para JavaScript.

¿Me estoy perdiendo de algo?

¿Fue útil?

Solución

El objetivo de Node.js es que está basado en eventos. Todo el código se ejecuta en los controladores de eventos en un solo hilo. No hay problemas de concurrencia porque el código no se ejecuta simultáneamente. La desventaja es que cada controlador de eventos debe salir rápidamente porque bloquea los otros eventos.

En su ejemplo, el código iniciará el disco IO y saldrá de inmediato. La infraestructura Node.js notificará al programa que la operación IO se completó ejecutando un controlador de eventos. El evento del temporizador se llamará antes o después del evento IO, pero nunca simultáneamente.

Otros consejos

JavaScript es un solo hilo. Si llega el momento cuando se supone que su función se ejecuta (en función de cómo llamó a SetTimer), y el código principal aún se está ejecutando, la función no se ejecutará hasta que el código principal se haya completado.

Solo hay un hilo; ver: Node.js en máquinas de múltiples núcleos

Especularía que esto se debe a que múltiples subprocesos no son compatibles con el motor JavaScript V8 subyacente, ya que, por lo general, JavaScript se ejecuta dentro de un navegador (donde en un caso de Windows solo hay un solo hilo de UI) y no admite múltiples hilos.

Hay esta cosa en JavaScript llamado Corrido Lo que garantiza que si un código está ejecutando se ejecuta completamente antes de que cualquier otro código (asíncrono) se ejecute, por lo tanto, sin problemas de concurrencia.

En el caso de su ejemplo, cada vez que se llama la devolución de llamada del temporizador, se ejecutará por completo y nunca será preventada en el medio para ejecutar algún otro código.

Ver Por qué no hay herramienta de control de concurrencia en JavaScript para más detalles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top