Acerca de Node.js
¿Qué es Node.js?
Node.js es un entorno de ejecución en el escritorio que permite ejecutar programas escritos en JavaScript, con el soporte de múltiples librerías proporciona una gran variedad de opciones para la creación de diferentes tipos de aplicaciones del lado del servidor, desde aplicaciones de línea de comando, APIs hasta servidores Web, pero uno de sus usos más efectivos es todo lo relacionado con RTC (Real Time Communication).
Node.js, está construido encima de la librería V8, que 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 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.
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.
Otra librería muy importante es libuv, que 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 Open Source, su código fuente y el de las principales librerías se pueden encontrar en los siguientes enlaces:
¿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 esta es 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 instrucció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 cuál 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 se explicará en detalle más adelante.
En conclusión, Node.js no es solo single thread, es multi thread cuando es necesario.