2010-11-17 22 views
8

Saludos,javascript: ¿problemas de simultaneidad y concurrencia?

He estado estudiando javascript, nodejs. Y no entiendo cómo se evitan los problemas de simultaneidad en JavaScript.

Digamos que estoy trabajando en un objeto

var bigObject = new BigObject(); 

y tengo una setTimer(function(){ workOnBigOjbect...}) que también lo hará trabajar en bigOjbect.

Si he S de disco se está escribiendo en bigObject, y un objeto de temporizador trabajando en bigObject, y regularmente la lectura de códigos de bigObject, cómo se evitan los problemas de concurrencia?

En un lenguaje normal, utilizaría un patrón de cola/comando mutex o hilo seguro. Tampoco veo mucha discusión sobre las condiciones de carrera para javascript.

¿Echo de menos algo?

Respuesta

9

El objetivo de node.js es que sea un evento controlado. Todo el código se ejecuta en controladores de eventos en un único 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á inmediatamente. La infraestructura node.js notificará al programa que la operación IO se completó al ejecutar un controlador de eventos. El evento del temporizador se llamará antes o después del evento IO, pero nunca al mismo tiempo.

+3

* scrrraatchhhhh * el sonido de los engranajes cambiando en mi cabeza! Lo estoy obteniendo, pero necesito mediar en esto un poco más. – Daniel

+1

La mejor manera de entenderlo es usarlo: escriba algunos programas pequeños en node.js. – Amnon

+0

@Daniel, ¿quisiste decir meditar? :) Además, creo que acabo de escuchar los mismos sonidos en mi cabeza. ¿Cuántas veces, ir y venir entre idiomas y plataformas antes de que mi cerebro se derrumbe? – snapfractalpop

3

Javascript es de subproceso único. Si llega la hora en que se supone que se debe ejecutar su función (según cómo llamó a setTimer), y el código padre aún se está ejecutando, la función no se ejecutará hasta que se complete el código padre.

2

Solo hay un hilo; ver: Node.js on multi-core machines

Me gustaría especular que esto se debe a múltiples hilos no se admiten en el motor JavaScript V8 que subyace desde típicamente JavaScript se ejecuta dentro de un navegador (donde en un caso de ventanas sólo hay un único hilo de interfaz de usuario) y no es compatible múltiples hilos.

+0

En realidad, es una decisión de diseño: los procesos son la unidad fundamental de node.js. En cualquier caso, JavaScript es un lenguaje que se destaca por lo que los hilos realmente no tienen sentido. – xj9

1

Hay algo así en javascript llamado Run-to-Completion que asegura que si un código se está ejecutando se ejecuta completamente antes de que se ejecute cualquier otro código (asíncrono), por lo tanto, no hay problemas de concurrencia.

En el caso de su ejemplo cada vez que se llame a la devolución de llamada del temporizador, se ejecutará por completo y nunca se anulará en el medio para ejecutar otro código.

Ver Why no concurrency control tool in javascript para más detalles.

Cuestiones relacionadas