Si Node.js tiene un solo subproceso, ¿cómo manejar la concurrencia?

Node js es una máquina virtual de código abierto que utiliza javascript como lenguaje de secuencias de comandos. A pesar de ser de un solo subproceso, es una de las tecnologías web más populares. La razón por la que el Node js es popular a pesar de ser de un solo subproceso es la naturaleza asíncrona que hace posible manejar la concurrencia y realizar múltiples operaciones de E/S al mismo tiempo. Node js usa un bucle de eventos para mantener la concurrencia y realizar operaciones de E/S sin bloqueo.

Tan pronto como se inicia Node js, inicia un ciclo de eventos. El bucle de eventos funciona en una cola (que se denomina cola de eventos ) y realiza tareas en orden FIFO (primero en entrar, primero en salir). Ejecuta una tarea solo cuando no hay una tarea en curso en la pila de llamadas . La pila de llamadas funciona en orden LIFO (último en entrar, primero en salir). El ciclo de eventos verifica continuamente la pila de llamadas para verificar si hay alguna tarea que deba ejecutarse. Ahora, cada vez que el bucle de eventos encuentra una función, la agrega a la pila y se ejecuta en orden.  

Veamos un ejemplo para obtener una comprensión adecuada de cómo funciona la pila de llamadas y el bucle de eventos y cómo maneja la concurrencia,

Ejemplo 1: En este ejemplo, veremos el funcionamiento de la pila de llamadas.

Javascript

<script>
function add(a,b){
   return a+b;
}
function print(n){
   console.log(`Two times the number ${n} is `+add(n,n));
}
  
print(5);
</script>

Producción:

Two times the number 5 is 10

Explicación: aquí, cuando se ejecuta el código, se invocará la función print(5) y se insertará en la pila de llamadas. Cuando se llama a la función, comienza a consolar la declaración dentro de ella, pero antes de consolar la declaración completa, encuentra otra función add(n,n) y suspende su ejecución actual, y empuja la función add a la parte superior de la pila de llamadas. Ahora la función devolverá la suma a+b y luego saldrá de la pila y ahora la función previamente suspendida comenzará a ejecutarse y registrará la salida en la consola y luego esta función también saldrá de la pila y ahora la pila está vacía. . Así es como funciona una pila de llamadas. 

Ejemplo 2: En este ejemplo, veremos el funcionamiento del bucle de eventos.

Javascript

<script>
function func(){
    console.log("Statement 1 inside function");
    setTimeout(function(){
        console.log("Statement 2 inside function");
    },2000);
    console.log("Statement 3 inside function");
      
}
console.log("Statement outside function");
func();
</script>

Producción: 

Statement outside function
Statement 1 inside function
Statement 3 inside function
Statement 2 inside function

Explicación:En el ejemplo anterior. la primera declaración de la consola «función externa de la declaración» se insertará en la pila y se iniciará sesión en la consola y se sacará de la pila. Ahora se invocará la función func() y se colocará en la pila. Luego, la declaración 1 «Declaración 1 dentro de la función» se insertará y se registrará en la consola y se sacará de la pila. Luego, el tiempo de ejecución va a la función setTimeout() y, debido a que esta es una API web, va al navegador, ahora el navegador configurará el temporizador y lo ejecutará y luego saldrá de la pila y, mientras tanto, la siguiente declaración se abre camino para llamar a la pila y por lo tanto, la «Declaración 3 dentro de la función» se imprimirá en la consola. Ahora, cuando se completen 2 segundos (2000 ms), el navegador devolverá la función a la cola de eventos. Ahora, el ciclo de eventos verifica si la pila de llamadas está vacía o no, luego empuja la función a la pila de llamadas y la «Declaración 2 dentro de la función» se imprimirá en la consola y la función saldrá de la pila. Ahora la función está completa y no quedan más eventos. 

Así es como se puede lograr la concurrencia mediante el uso de un bucle de eventos y una pila de llamadas.

Publicación traducida automáticamente

Artículo escrito por nirmitsawhney01 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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