Modelo de ejecución y Ecosistema de Node.js

Publicada en Publicada en Node.js

Compartelo con tus amigos!

Continuando con la entrada anterior en la se habló acerca de Node.js desde un enfoque un tanto general, ahora ahondaremos un poco más en el.

¿Cómo funciona el modelo de ejecución de Node.js?

El modelo de ejecución de Node.js sigue el de JavaScript en el navegador. Es muy diferente de la de la mayoría de las plataformas de programación de propósito general.

Declarado formalmente, Node.js tiene un modelo de ejecución de un solo subproceso, sin bloqueos y basado en eventos. Vamos a definir cada uno de estos términos en esta sección.

  • Non-blocking
  • Event-driven
  • Single-thread

Non-blocking

Puesto simplemente, Node.js reconoce que muchos programas pasan la mayor parte de su tiempo esperando que otras cosas sucedan, por ejemplo, operaciones de e/s lentas como acceso a discos y solicitudes de red.

Node.js se ocupa de esto haciendo que estas operaciones no se bloqueen. Esto significa que la ejecución del programa puede continuar mientras ocurren. Por ejemplo, la función stat de la API de filesystem para recuperar estadísticas sobre un archivo puede ser llamada como sigue:

fs.stat('/hola/mundo', function (error, stats) { 
console.log('Archivo actualizado en: ' + stats.mtime); 
});

Se pasan dos argumentos a la función stat de fs: el nombre del archivo en el que estamos interesados y una función callback. La llamada stat de fs devuelve inmediatamente, devolviendo el control de ejecución al subproceso actual pero no devolviendo un valor. Si hay más comandos después de la llamada stat de fs, éstas se ejecutarán. De lo contrario, el subproceso se libera para realizar otro trabajo. La función de devolución de llamada se invoca sólo después de que el Runtime haya finalizado la comunicación con el sistema de archivos. El resultado de la operación del sistema de archivos se pasa a la función callback.

Este enfoque sin bloqueo también se llama programación asincrónica. Otras plataformas soportan esto (Por ejemplo, las palabras clave asíncronas / de espera de C# y la Biblioteca paralela de tareas de .NET). Sin embargo, se cuece al horno en Node.js de una manera que lo hace simple y natural de utilizar. Los métodos de la API asíncrona se llaman de la misma manera que fs. Todos ellos toman una función de devolución de llamada que obtiene errores y argumentos de resultado.

Event-driven

La naturaleza impulsada por eventos de Node.js describe cómo se programan las operaciones. En entornos de procedimiento típicos, un programa tiene un punto de entrada que ejecuta un conjunto de comandos hasta la terminación, o entra en un bucle y realiza algún procesamiento en cada iteración.

Node.js tiene un bucle de eventos integrado que no está expuesto al desarrollador. Es el trabajo del event loop  para decidir qué pieza de código se va a ejecutar a continuación. Típicamente, esta será una función de callback que está lista para ejecutarse en respuesta a algún otro evento. Por ejemplo, una operación de filesystem puede haberse completado, un timeout puede haber expirado, o una nueva solicitud de red puede haber llegado.

Este bucle de eventos integrado simplifica la programación asincrónica proporcionando un enfoque coherente y evitando la necesidad de aplicaciones para administrar su propia programación.

Single-thread

La naturaleza de un solo subproceso de Node.js simplemente significa que sólo hay un subproceso de ejecución en cada proceso. Además, cada pieza de código está garantizada para ejecutarse hasta su terminación sin ser interrumpida por otras operaciones. Esto simplifica enormemente el desarrollo y hace que los programas sean más fáciles de razonar. Elimina la posibilidad de una serie de problemas de simultaneidad. Por ejemplo, no es necesario sincronizar/bloquear el acceso al estado de proceso compartido . Un proceso no puede estancarse o crear condiciones de carrera dentro de su propio código. La programación de un solo subproceso es factible si el hilo nunca se bloquea esperando a que finalice el trabajo de larga duración. De esta forma, este modelo de programación simplificado es posible gracias a la naturaleza no bloqueante de Node.js.

Ahora que tenemos más claro como funciona el modelo de ejecución de Node.js veamos su ecosistema.

Ecosistema de Node.js

Las APIs de Node.js incorporadas proporcionan un núcleo de bajo nivel para la creación de aplicaciones. Las aplicaciones típicamente sólo utilizan un pequeño número de estas API directamente. A menudo utilizan módulos de biblioteca de terceros que proporcionan abstracciones de mayor nivel para el desarrollo de aplicaciones.

Node.js tiene su propio gestor de paquetes, npm. Esto es similar a NuGet en .Net . Las aplicaciones especifican sus dependencias en un archivo JSON simple.

El registro de la npm proporciona un repositorio central para los paquetes. Este registro ha crecido rápidamente y ya es mucho mayor (en términos de número de paquetes disponibles) que los repositorios correspondientes para otras plataformas (ver http://www.modulecounts.com/). Hay cientos de miles de paquetes disponibles, proporcionando una gran variedad de funcionalidades.

La herramienta de línea de comandos de npm se puede utilizar para descargar paquetes e instalar otros nuevos. Las dependencias de biblioteca se instalan localmente en cada aplicación. Algunos paquetes proporcionan herramientas de línea de comandos, que pueden instalarse globalmente en lugar de en un proyecto específico.

Muchos frameworks disponibles en npm se dividen en un pequeño núcleo extensible y un número de módulos componibles. Este enfoque hace que sea fácil de entender las bibliotecas en las que depende su aplicación, evitando la necesidad de razonar sobre complejos marcos pesados.

La consistencia de la llamada a métodos de API sin bloqueo (asincrónicos) en Node.js lleva a cabo a través de sus bibliotecas de terceros. Esta consistencia facilita la creación de aplicaciones asincrónicas en todo el conjunto.

Finalmente, se pueden ver la cantidad de npm existentes en Module Counts.

Compartelo con tus amigos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *