Cómo funciona el bucle de eventos de nodejs

Una de las mejores ventajas de Node.js sobre otras tecnologías del lado del servidor es la ejecución de código asincrónico. Pero, ¿cómo lo ejecuta Node.js? Es posible que haya oído hablar del bucle de eventos que ayuda a JavaScript a ejecutar código asincrónico y esta publicación trata sobre comprender cómo funciona el bucle de eventos.

Considere el siguiente código.

consola. log ( “soy el primero” ) ;

consola.
log ( “soy el segundo” ) ;

consola.
log ( “soy el tercero” ) ;

Si ejecuta este código, obtendrá el resultado de la siguiente manera.

soy el primero

soy el segundo


soy el tercero

Pero, ¿cómo funciona internamente? Si tiene experiencia en CS, es posible que haya oído hablar de Stack, que los compiladores utilizan para manejar la llamada de función.

Entonces, si hay alguna llamada a la función, se inserta en la pila y la máquina toma el código de la pila y lo ejecuta. Entonces, en el caso del código anterior, será así.

Pero este código es sincrónico, es decir, se ejecuta en serie. Pero, ¿cómo es que funciona el asincrónico? Eso es bastante más divertido. Echemos un vistazo.

Considere el siguiente código.

experiment.js
consola. log ( “soy el primero” ) ;


setTimeout
( función timeout ( ) {

    consola.
log ( “soy el segundo” ) ;
} , 5000 ) ;


consola.
log ( “soy el tercero” ) ;

Copie este código y péguelo en el nombre de archivo experiment.js y ejecútelo usando

node experiment.js

Obtendrá la siguiente salida.

Notaste alguna diferencia ? ¡Es “primero”, “tercero” y luego “segundo”! ¿Por qué es que “setTimeout” es una función asíncrona y Node.js no bloqueará el programa para esperarlo?

seguirá ejecutándose y al final será la segunda consola. Pero de nuevo, ¿cómo funciona ?

Aquí viene el concepto de “bucle de eventos” . Para manejar la naturaleza asincrónica del programa, Node.js usa una “Cola” externa donde inserta la devolución de llamada del código asincrónico en lugar de empujarlo a la pila.

No hay un nombre oficial de esta cola, en algún lugar escuché “cola de mensajes” y algunos dicen “cola de devolución de llamada” o puede ser algo más. ¡Puedes elegir cualquiera!

Dado que ese fragmento de código no está en la pila, el tiempo de ejecución del nodo no lo ejecutará inmediatamente. Dependiendo de la naturaleza del código asincrónico (E / S, llamada de red, DNS, etc.), Node.js generará el subproceso “libuv” y lo ejecutará, y tan pronto como se complete el procesamiento del subproceso y el resultado esté listo para ser procesado por el tiempo de ejecución del nodo, el bucle de eventos comprueba “¿la pila está vacía?” Si la pila está vacía y la cola tiene algunos datos, el bucle de eventos tomará la parte superior y la empujará dentro de la pila para su procesamiento.

La tarea del bucle de eventos es verificar si hay algún elemento presente en la cola y si la pila está vacía, empújela en la pila o espere la siguiente marca (Sí, process.nextTick).

Aquí intenté mostrarlo a través de una imagen (no soy bueno en eso).

Para probar lo anterior, considere el siguiente código.

experiment.js
consola. log ( “soy el primero” ) ;


setTimeout
( función timeout ( ) {

    consola.
log ( “soy el segundo” ) ;
} , 0 ) ;


consola.
log ( “soy el tercero” ) ;

Veamos el resultado de la misma.

Aunque configuré el tiempo de espera en 0 segundos, todavía le dará el mismo resultado que el anterior y eso se debe a la cola de devolución de llamada. setTimeout se ejecutará inmediatamente, pero dado que Stack no está vacío, no lo insertará en la pila y el tiempo de ejecución del nodo no lo procesará.

Deja una respuesta

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