¿Qué es Node.js?

Node.js es un programa de escritorio que, principalmente, está escrito en C++ (y JavaScript) pero permite escribir aplicaciones utilizando como lenguaje JavaScript. Por esta razón muchos le llaman el JavaScript de escritorio, pero Node.js es un poco más que eso. Con el soporte de múltiples librerías proporciona una gran variedad de apoyos para la creación de diferentes tipos de aplicaciones, desde aplicaciones de línea de comando, REST API hasta servidores Web, pero uno de sus usos más efectivos es todo lo relacionado con RTC (Real Time Communication).

De hecho Node.js soporta la incorporación de librerías escritas en C++ y estas se pueden vincular a los proyectos ampliando aún más el sustento de nuevas funcionalidades.

Node.js es Open Source, ya que muchas personas contribuyen y mantienen su código fuente.

Librería de V8 JavaScript

Había mencionado anteriormente que Node.js permite escribir aplicaciones utilizando JavaScript como lenguaje, pero está escrito en C++ ¿Como es esto posible?, Es debido a una de las librerías más importantes para Node.js, V8 también escrita en C++. Esta permite convertir el código escrito por el usuario en JavaScript a código de máquina para ser interpretado por el computador más eficientemente.

Esta librería es ahora código abierto, liberado por Google. Es utilizada por otras aplicaciones como el navegador Web Google Chrome, el cual la usa para interpretar el código escrito en JavaScript en el navegador Web.

Librería libuv

La librería libuv permite a Node.js implementar muchas operaciones asincrónicas como: lectura de archivos, peticiones HTTP y muchas otras operaciones mayormente de entrada/salida, permitiendo así procesar varias cosas al "mismo tiempo".

¿Node.js es single thread?

Cuando se habla de "programas" ejecutándose, realmente la mayoría lo hace como procesos en el sistema. Cada uno de estos procesos puede utilizar uno o varios hilos (threads) para hacer las diferentes operaciones con el procesador u operaciones de entrada/salida como lectura de archivos; esto permite realizar varias tareas de manera "simultánea", aunque este último concepto también depende de la arquitectura que tenga el procesador para soportar este tipo operaciones.

Se menciona mucho que Node.js es single thread debido a la implementación de JavaScript de la librería V8 que es single thread. Esto significaría que solo puede procesar una cosa al tiempo, pero esto no es del todo cierto, así que realizaremos la primera aclaración:

  • El código escrito por el usuario se ejecuta en single thread en el event loop (el cual veremos con más detalle más adelante)

Pero como se dijo antes, Node.js utiliza otras librerías para añadir funcionalidades como libuv; esta le permite leer archivos del sistema. Entonces, cuando esta instrucción escrita por el usuario es ejecutada en el event loop, se crea un nuevo hilo en el proceso para realizar esta operación y notificará al hilo principal cuando este termine. Es entonces cuando realizaremos nuestra segunda aclaración:

  • Cuando una operación requiere hacer una operación de entrada/salida o un procesamiento independiente, un nuevo hilo se crea en el proceso y, una vez finalizada la operación, notifica al hilo principal.

Por defecto libuv determina cual es la cantidad de hilos que tiene para procesar las operaciones y, si estos están "ocupados", deja la tarea en espera hasta que algún otro hilo termine su ejecución. Este parámetro se puede sobreescribir en el código del usuario si es necesario, pero también depende mucho de la arquitectura del procesador para realizar un buen balance entre la capacidad del procesador y el número de hilos que se establezcan.

La anterior es la razón por la cual se menciona que libuv le agrega a Node.js la capacidad de procesar tareas de manera simultánea, y muchas de estas funciones tiene su versión sincrónica y asincrónica, lo que también explicaremos en detalle más adelante.

En conclusión Node.js no es solo single thread, es multi thread cuando es necesario.