2011-03-30 29 views
22

Me pregunto si se requieren mutexes/bloqueos para el acceso a datos dentro de Node.js. Por ejemplo, digamos que he creado un servidor simple. El servidor proporciona un par de métodos de protocolo para agregar y eliminar de una matriz interna. ¿Debo proteger el arreglo interno con algún tipo de mutex?Node.js y Mutexes

Entiendo que Javascript (y por lo tanto Node.js) tiene un solo subproceso. Simplemente no tengo claro cómo se manejan los eventos. ¿Los eventos interrumpen? Si ese es el caso, mi aplicación podría estar en el medio de leer la matriz, ser interrumpida para ejecutar una devolución de llamada de evento que cambia la matriz, y luego continuar procesando la matriz que ahora ha sido cambiada por la devolución de llamada de evento.

Respuesta

20

Me pregunto si se requieren mutexes/bloqueos para el acceso a los datos dentro de Node.js.

Nope! Los eventos se manejan en el momento en que no hay otro código para ejecutar, esto significa que no habrá contención, ya que solo el código que se está ejecutando actualmente tiene acceso a esa matriz interna. Como efecto secundario de que un nodo sea de subproceso único, los cálculos largos bloquearán todos los demás eventos hasta que se realice el cálculo.

Entiendo que Javascript (y por lo tanto Node.js) tiene un solo subproceso. Simplemente no tengo claro cómo se manejan los eventos. ¿Los eventos interrumpen?

No, los eventos no se interrumpen. Por ejemplo, si coloca un while(true){} en su código, detendría la ejecución de cualquier otro código, porque siempre hay otra iteración del ciclo que se ejecutará.

Si tiene un cálculo de larga ejecución, es una buena idea usar process.nextTick, ya que esto permitirá que se ejecute cuando no se está ejecutando nada más (estoy confundido con esto: el ejemplo a continuación muestra que yo ' Probablemente tenga razón al respecto, probablemente sin correr interrupciones).

Si tiene alguna otra pregunta, siéntase libre de detenerse en y hacer preguntas. Además, pedí un par de personas a mirar esto y asegurarse de que no estoy totalmente equivocado;)

var count = 0; 

var numIterations = 100; 
while(numIterations--) { 
    process.nextTick(function() { 
    count = count + 1; 
    }); 
} 

setTimeout(function() { 

    console.log(count); 

}, 2); 

// 
//=> 100 
// 

Gracias a AAA_awright de # Node.js :)

+1

mi lectura del documento Node.js para process.nextTick (devolución de llamada) es que añade devolución de llamada() a la cola para el siguiente pulso. No dice nada acerca de esperar un tic o ejecutar el tic evento loop antes de volver ... así que leí este código como agregar 100 devoluciones de llamada que cuentan ++ a la lista TODO para el siguiente tic ... ?? – Paul

+0

@Paul correcto!/fyi # node.js IRC te da la bienvenida: http://bit.ly/nodeIRC – DTrejo

27

cerraduras y las exclusiones mutuas son de hecho necesarias a veces, incluso si Node.js tiene un único hilo.

Supongamos que tiene dos archivos que deben tener el mismo contenido y no tener el mismo contenido se considera un estado incoherente. Ahora suponga que necesita cambiarlos sin bloquear el servidor. Si hace esto:

fs.writeFile('file1', 'content', function (error) { 
    if (error) { 
     // ... 
    } else { 
     fs.writeFile('file2', 'content', function (error) { 
      if (error) { 
       // ... 
      } else { 
       // ready to continue 
      } 
     }); 
    } 
}); 

se cae en un estado incoherente entre las dos llamadas, cuando otra función en la misma secuencia de comandos puede ser capaz de leer los dos archivos.

El módulo rwlock es perfecto para manejar estos casos.

+0

Esto es lo que pensé. ¿No es la otra respuesta incorrecta? –

+1

La respuesta no es realmente incorrecta, porque la pregunta es "¿Necesito proteger el arreglo interno con algún tipo de mutex?" – sheldonh

+0

Supongamos que tiene varias instancias de servidor Node.js que ejecutan el mismo código. ¿El módulo 'rwlock' trata con esto o necesitas algo como Redis? –

0

Estaba buscando una solución para mutexes de nodo. En ocasiones, son necesarios mutexes: puede ejecutar varias instancias de su aplicación de nodo y puede querer asegurarse de que solo uno de ellos esté haciendo algo en particular. Todas las soluciones que pude encontrar no fueron de proceso cruzado o de redis.

E hice mi propia solución utilizando bloqueos de archivo: https://github.com/Perennials/mutex-node

+0

¿Qué pasa con redis? Usted pude decirme ? –