El proceso de ejecución de NodeJS

  • Por
Cómo es el proceso de ejecución de NodeJS y qué podemos hacer para controlarlo mediante el objeto global process.

Una de las primeras cosas que vamos a aprender en NodeJS es trabajar y entender el proceso de ejecución del programa, que tiene sus particularidades especiales en este lenguaje. En los capítulos de introducción en el Manual de NodeJS ya hemos abordado algunos conceptos bastante interesantes, pero ahora lo veremos aplicado a código.

Antes de comenzar queremos volver a recalcar la naturaleza de NodeJS como un lenguaje de programación de propósito general, con el que podemos hacer todo tipo de aplicaciones. Normalmente comenzaremos con programas que se ejecutarán en la consola de comandos, o terminal, de tu sistema operativo, pero a partir de ahí sus aplicaciones son muy extensas.

Piensa entonces que NodeJS se arranca mediante la consola de comandos y entonces el proceso que se encargará de ejecutarlo es el iniciado con la propia consola.

Single Thread (único hilo)

Una de las características de NodeJS es su naturaleza "Single Thread". Cuando pones en marcha un programa escrito en NodeJS se dispone de un único hilo de ejecución.

Esto, en contraposición con otros lenguajes de programación como Java, PHP o Ruby, donde cada solicitud se atiende en un nuevo proceso, tiene sus ventajas. Una de ellas es que permite atender mayor demanda con menos recursos, uno de los puntos a favor de NodeJS.

Para conseguir que la programación Single Thread de NodeJS pueda producir resultados satisfactorios debemos entender su característica no bloqueante, que abordamos al hablar de la programación asíncrona en el artículo de las características de NodeJS. En resumen, todas las operaciones que NodeJS no puede realizar al instante, liberan el proceso se libera para atender otras solicitudes. Pero como hemos dicho en este artículo nos proponemos aterrizar estas ideas en algo de código que nos permita ir aprendiendo cosas nuevas de NodeJS.

Nota: Cabe aclarar que el single thread no implica que Node no pueda disponer de varios hilos de manera interna para resolver sus problemas. Es decir, nuestro hilo principal por ejemplo cuando estamos desarrollando un servidor con Node podrá estar atento a solicitudes, pero una vez que se atiendan, Node podrá levantar de manera interna otros procesos para realizar todo tipo de acciones que se deban producir como respuesta a esas solicitudes. También será posible si lo deseamos disponer de diversos programas ejecutados en procesos distintos, o clones de un mismo proceso para atender diversas solicitudes más rápidamente.

Objeto process

El objeto process es una variable global disponible en NodeJS que nos ofrece diversas informaciones y utilidades acerca del proceso que está ejecutando un script Node. Contiene diversos métodos, eventos y propiedades que nos sirven no solo para obtener datos del proceso actual, sino también para controlarlo.

Nota: El hecho de ser un objeto global quiere decir que lo puedes usar en cualquier localización de tu código NodeJS, sin tener que hacer el correspondiente require().

En la documentación de Node encuentras todo lo que hay en este objeto process: https://nodejs.org/docs/latest/api/process.html

Nota: La documentación de NodeJS está organizada por versiones de la plataforma. El link anterior te dirige a la última versión del API de Node, pero tú deberías consultar los docs de la versión con la que estés trabajando. No obstante, el estado del API para el objeto process está definido desde hace mucho tiempo y difícilmente cambiará.

Consultar datos del proceso

Se pueden hacer muchas cosas con el proceso y consultar diversos datos de utilidad. Por ejemplo, veamos el siguiente código donde podemos examinar información diversa sobre el proceso actual y la plataforma donde estamos ejecutando este programa:

console.log('id del proceso: ', process.pid);
console.log('título del proceso: ', process.title);
console.log('versión de node: ', process.version);
console.log('sistema operativo: ', process.platform);

Salir de la ejecución de un programa Node

A veces podemos necesitar salir inmediatamente de la ejecución de un programa en NodeJS. Esto lo podemos conseguir mediante la invocaciónn del método exit() del objeto process.

process.exit();
Nota: El comportamiento normal de un programa será salir automáticamente cuando haya terminado su trabajo. Técnicamente esto quiere decir, que se haya terminado la secuencia de ejecución de instrucciones de un script y que no haya trabajo pendiente en el "event loop". Sobre el bucle de eventos hablamos en el artículo de los eventos en Node.

Básicamente provocará que el programa acabe, incluso en el caso que haya operaciones asíncronas que no se hayan completado o que se esté escuchando eventos diversos en el programa.

El método exit puede recibir opcionalmente un código de salida. Si no indicamos nada se entiende "0" como código de salida.

process.exit(3);

Evento exit

Otra de las cosas básicas que podrás hacer mediante el objeto process es definir eventos cuando ocurran cosas diversas, por ejemplo la salida del programa.

Los eventos en Javascript se definen de manera estándar mediante el método on(), indicando el tipo de evento que queremos escuchar y una función callback que se ejecutará cuando ese evento se dispare. Dado que el evento exit pertenece al process, lo definiremos a partir de él.

process.on('exit', function(codigo) {
  console.log('saliendo del proceso con código de salida', codigo);
})

En este caso la función callback asociada al evento exit recibe aquel código de error que se puede generar mediante la invocación del método exit() que conocimos en el anterior punto.

Conclusión

Hemos aprendido algo de conocimiento general sobre NodeJS y algo en particular sobre el proceso de ejecución de un programa escrito en Node, cuya funcionalidad está disponible mediante el objeto global process.

Hemos visto varios ejemplos de propiedades dependientes de process, el método exit(), muy útil para la salida de un programa, así como la definición de uno de los varios eventos disponibles dentro de process, que nos permitirá hacer cosas cuando el programa NodeJS se pare. Con esto tenemos una visión muy general sobre el proceso de ejecución de node, pero comprobarás que hay mucho más en la documentación oficial.

Solo para posibles dudas, dejo aquí un código completo que podrás ejecutar para ver los ejemplos relatados en este artículo:

"use strict"

process.on('exit', function(codigo) {
  console.log('saliendo del proceso con código de salida', codigo);
})

console.log('id del proceso: ', process.pid);
console.log('título del proceso: ', process.title);
console.log('versión de node: ', process.version);
console.log('sistema operativo: ', process.platform);

process.exit(3);
console.log('esto no se llegará a ejecutar');

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Pedro Carmelo

05/1/2017
hilo único / multihilo
Hola, y solo por curiosidad, node también puede trabajar como multihilo?