¿Node.js tiene un solo subproceso?

Node.js se creó explícitamente como un experimento en el procesamiento asíncrono. La teoría era que el procesamiento asíncrono en un solo subproceso podría proporcionar más rendimiento y escalabilidad bajo cargas web típicas que la implementación típica basada en subprocesos.

Además, una aplicación node.js que no hace cosas intensivas en CPU puede ejecutar miles de conexiones simultáneas más que Apache o IIS u otros servidores basados ​​en hilos.

La naturaleza asincrónica de un solo subproceso complica las cosas. ¿Pero honestamente crees que es más complicado que enhebrar? ¡Una condición de carrera puede arruinar todo tu mes! ¡O vacíe su grupo de subprocesos debido a alguna configuración en alguna parte y observe cómo su tiempo de respuesta se ralentiza! Sin mencionar los puntos muertos, las inversiones prioritarias y todos los otros giros que van con el subprocesamiento múltiple.

En pocas palabras, el nodo se basa en V8, que tiene un solo subproceso interno. Hay formas de evitar las restricciones para las tareas intensivas de CPU.

Porque Node.js se basa en la programación controlada por eventos donde el flujo de ejecución está determinado por los eventos. Un evento en Javascript es manejado por los controladores de eventos o la función de devolución de llamada que se invoca cuando se produce un evento significativo.

Por ejemplo, para enviar una consulta a la base de datos en una programación de E / S de bloqueo:

resultado var = consulta (consulta a la base de datos);
hacer_algo (resultado)

Esto bloquea la ejecución del código y espera la respuesta del servidor. En un programa dirigido por eventos,

función invokeAfterResponse (resultado) {
hacer_algo (resultado);
}

consulta (consulta a la base de datos, invokeAfterResponse);

En lugar de asignar el valor a la variable, le hemos dado una función a la consulta que se puede invocar después de que el evento específico de la base de datos haya finalizado. Y las funciones en Javascript se ejecutan hasta su finalización y no se pueden interrumpir.

Esto es posible porque Javascript tiene cierres y funciones de primera clase. Una función puede heredar variables de su entorno envolvente en Javascript. Cuando pasa una devolución de llamada de función para invocarla más tarde, esta función aún recuerda mágicamente el contexto o el entorno en el que se declaró. Esta poderosa característica es el corazón de Node.js y es de un solo subproceso.

Desde la perspectiva del programador de aplicaciones de nodo, sí, node.js es de un solo subproceso.

Desde la perspectiva de la implementación del nodo, ningún sistema llama a ese bloque en los subprocesos de trabajo que el tiempo de ejecución del nodo gestiona en nombre del programador del nodo.

Dicho esto, hay varios enfoques para agregar un comportamiento similar a un hilo a Node, como: laverdet / node-fibres y audreyt / node-webworker-thread. Estas bibliotecas pueden ser útiles en ciertos casos, como la implementación de cálculos vinculados a la CPU, pero el programador debe evitar el uso de algoritmos de subprocesos múltiples que requieren la existencia de un estado compartido, ya que varios subprocesos no pueden acceder a dicho estado de forma segura.

Bien

Sí. En realidad no. Bien quizás.

Comencemos con un “sí”. El nodo del programa se ejecuta en un solo subproceso: no hay forma de que dos de sus funciones se ejecuten al mismo tiempo.

Pero si usa un módulo de clúster, entonces el programa puede ejecutarse en múltiples procesos (por lo tanto, esencialmente subprocesos diferentes).

Entonces, ¿”no” al hilo único? Bueno no. Porque incluso si son hilos diferentes, no comparten memoria ni ninguno de los recursos. Pueden usar la comunicación entre procesos, pero es como ejecutar dos instancias de un programa, no exactamente múltiples hilos.

Entonces, ¿un “sí” definitivo? Nodo es de un solo subproceso? Bueno no. Porque además de su programa, el tiempo de ejecución del nodo también necesita ejecutar un compilador para traducir su programa. Más de uno, de hecho. Necesita hacer un seguimiento de su ciclo de eventos y llamar a sus devoluciones de llamada. Monitorear recursos. Hacer cosas de recolección de basura. Muchos otros trabajos. Y lo hace en múltiples hilos apropiados, de estado compartido y autónomos, etc.

Entonces, ¿el nodo tiene un solo subproceso? Si y no. Tal vez.

Básicamente sí. El JS es, y es impulsado por eventos. Cualquier cosa que pueda estar bloqueando (como IO) se inicia en un hilo hasta que se hace.