Bucle de eventos sin bloqueo en Node.js

NodeJS tiene la capacidad de hacer varias cosas al mismo tiempo, lo que se denomina programación asíncrona.

Piense en un camarero que trabaja en un restaurante. Recorre el restaurante tomando pedidos de los clientes y sirviéndolos cuando su respectiva comida está lista. ¿Qué sucede cuando el mesero toma un pedido de un cliente y espera hasta que la comida esté preparada, la sirve y luego pasa al siguiente cliente? De esta forma el tiempo de espera de cada cliente aumenta y el restaurante sería un gran fiasco. El último representa la programación síncrona y el anterior representa la programación asíncrona.

Sin bloqueo: la naturaleza sin bloqueo de node.js simplemente significa que node.js continúa con la ejecución del programa en lugar de esperar largas operaciones de E/S o requests HTTP. es decir, el código no relacionado con JavaScript es procesado en segundo plano por diferentes subprocesos o por el navegador que se ejecuta cuando node.js completa la ejecución del programa principal y cuando los datos requeridos se obtienen con éxito. De esta manera, las operaciones que toman mucho tiempo no bloquean la ejecución de la parte restante del programa. De ahí el nombre Non-Blocking.

Ejemplo: Eche un vistazo al fragmento de código a continuación para obtener una mejor comprensión de la naturaleza sin bloqueo de Node.js.

Javascript

console.log("First one to start");
 
setTimeout(() => {
    console.log("I should wait for 3 seconds before execution");
}, 3000);
 
setTimeout(() => {
    console.log("I should wait for 0 seconds before execution");
}, 0);
 
console.log("It's time for me to end");

Producción:

Como puede ver, el resto del programa no se ve afectado por el largo retraso. Pero, ¿por qué se imprimió «Debería esperar 0 segundos antes de la ejecución» después de «Es hora de que termine». Bueno, profundicemos en el funcionamiento interno de Node.js.

La pila de llamadas: cualquier función de Node.js, cuando se invoca, va a la pila de llamadas. La primera función a invocar es la función principal. Cuando una función termina de realizar su trabajo, se elimina de la pila de llamadas. 

Node/API web: cualquier función que no esté relacionada con JavaScript, como las requests HTTP, se envían al navegador que utiliza C++ para procesarlas. Una vez que se procesan los datos/requests, el navegador los envía a la cola de devolución de llamada.

La cola de devolución de llamada: La cola de devolución de llamada contiene las funciones asincrónicas que están listas para ser ejecutadas (es decir, el largo período de espera ha terminado). Los elementos presentes en la cola de devolución de llamada solo se llaman cuando la pila de llamadas se vacía. 

El bucle de eventos: una vez que la pila de llamadas está vacía, el bucle de eventos sigue comprobando la cola de devolución de llamada para ejecutar las funciones asíncronas.

Cómo se ejecuta el código:

Paso 1: la función principal se envía a la pila de llamadas.

Paso 2: la primera declaración de console.log se envía a la pila de llamadas.

Paso 3: se imprime «First one to start» y la función console.log se elimina de la pila de llamadas.

Paso 4: La función setTimeOut(3000) se entrega al navegador para su procesamiento.

Paso 5: La función setTimeOut(0) se entrega al navegador para su procesamiento.

Paso 6: La función setTimeOut(0) ha sido procesada y entregada a la cola de devolución de llamada.

Paso 7: la última declaración de console.log se envía a la pila de llamadas.

Paso 8: se imprime «Es hora de que finalice» y la función console.log se elimina de la pila de llamadas.

Paso 9: La función principal se elimina de la pila de llamadas y el ciclo de eventos comienza a ejecutarse.

Paso 10: La función console.log presente en setTimeOut(0) se envía a la pila de llamadas.

Paso 11: se imprime «Debería esperar 0 segundos antes de la ejecución» y la función console.log se elimina de la pila de llamadas.

Paso 12: Después de esperar 3 segundos, el navegador asigna la función setTimeOut(3000) a la Cola de devolución de llamada.

Paso 13: La función console.log presente en setTimeOut(3000) se envía a la pila de llamadas.

Paso 14: se imprime «Debería esperar 3 segundos antes de la ejecución» y la función console.log se elimina de la pila de llamadas.

Diagrama:

Bucle de eventos sin bloqueo

Publicación traducida automáticamente

Artículo escrito por coder_srinivas 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 *