En esta respuesta a la pregunta -
¿Qué es la E/S sin bloqueo o asíncrona en Node.js?
la descripción no suena diferente del bucle de eventos en vanilla js. ¿Hay diferencia entre los dos? De lo contrario, ¿el bucle de eventos simplemente se renombra como "E/S asíncrona sin bloqueo" para vender Node.js sobre otras opciones más fácilmente?
Hay 2 bucles de eventos diferentes:
El Event Loop es un proceso que se ejecuta continuamente, ejecutando cualquier tarea en cola. Tiene varias fuentes de tareas que garantizan el orden de ejecución dentro de esa fuente, pero el navegador puede elegir de qué fuente tomar una tarea en cada vuelta del bucle. Esto permite que el navegador dé preferencia a las tareas sensibles al rendimiento, como la entrada del usuario.
Hay algunos pasos diferentes que el bucle de eventos del navegador verifica continuamente:
Cola de tareas : puede haber varias colas de tareas. El navegador puede ejecutar colas en el orden que desee. Las tareas en la misma cola deben ejecutarse en el orden en que llegaron, primero en entrar, primero en salir. Las tareas se ejecutan en orden y el navegador puede mostrarse entre tareas. La tarea de la misma fuente debe ir en la misma cola. Lo importante es que la tarea se ejecutará de principio a fin. Después de cada tarea, Event Loop irá a Microtask Queue y realizará todas las tareas desde allí.
Cola de microtareas: la cola de microtareas se procesa al final de cada tarea. Cualquier microtarea adicional en cola durante las microtareas se agrega al final de la cola y también se procesa.
Cola de devolución de llamada de animación: la cola de devolución de llamada de animación se procesa antes de que se vuelvan a pintar los píxeles. Se procesarán todas las tareas de animación de la cola, pero cualquier tarea de animación adicional en cola durante las tareas de animación se programará para el siguiente cuadro.
Canalización de renderizado : en este paso, se realizará el renderizado. El navegador decide cuándo hacer esto y trata de ser lo más eficiente posible. Los pasos de renderizado solo suceden si hay algo que realmente valga la pena actualizar. La mayoría de las pantallas se actualizan a una frecuencia determinada, en la mayoría de los casos 60 veces por segundo (60 Hz). Por lo tanto, si cambiáramos el estilo de página 1000 veces por segundo, los pasos de renderizado no se procesarían 1000 veces por segundo, sino que se sincronizarían con la pantalla y solo se renderizarían hasta una frecuencia que la pantalla sea capaz de hacer.
Algo importante a mencionar son las API web, que son efectivamente subprocesos. Entonces, por ejemplo, setTimeout() es una API que nos proporciona el navegador. Cuando llame a setTimeout() , la API web se hará cargo y la procesará, y devolverá el resultado al hilo principal como una nueva tarea en una cola de tareas.
El mejor video que encontré que describe cómo funciona Event Loops es este . Me ayudó mucho cuando estaba investigando cómo funciona Event Loop. Otros videos geniales son este y este . Definitivamente deberías revisarlos todos.
NodeJS Event Loop permite que NodeJS realice operaciones sin bloqueo al descargar la operación al kernel del sistema siempre que sea posible. La mayoría de los núcleos modernos tienen múltiples subprocesos y pueden realizar múltiples operaciones en segundo plano. Cuando se completa una de estas operaciones, el kernel le dice a NodeJS.
La biblioteca que proporciona el bucle de eventos a NodeJS se llama Libuv. De forma predeterminada, creará algo llamado Thread Pool con 4 subprocesos para descargar el trabajo asíncrono. Si lo desea, también puede cambiar el número de subprocesos en el grupo de subprocesos.
NodeJS Event Loop pasa por diferentes fases:
temporizadores : esta fase ejecuta devoluciones de llamadas programadas por setTimeout() y setInterval() .
Devoluciones de llamada pendientes : ejecuta devoluciones de llamada de E/S diferidas hasta la siguiente iteración del bucle.
inactivo, preparar - solo se usa internamente.
sondeo : recupera nuevos eventos de E/S; ejecutar devoluciones de llamada relacionadas con E/S (casi todas con la excepción de devoluciones de llamada de cierre, las programadas por temporizadores y setImmediate() ) El nodo se bloqueará aquí cuando corresponda.
check - aquí se invocan las devoluciones de llamada setImmediate() .
cerrar devoluciones de llamada: algunas devoluciones de llamada cercanas, por ejemplo, socket.on('close', ...) .
Entre cada ejecución del ciclo de eventos, Node.js verifica si está esperando alguna E/S asíncrona o temporizadores y se apaga limpiamente si no hay ninguno.
En el navegador, teníamos API web. En NodeJS, tenemos API de C++ con la misma regla.
Encontré este video útil si desea verificar más información.
El bucle de eventos es el mecanismo . La E/S asíncrona es el objetivo .
La E/S asíncrona es un estilo de programación en el que las llamadas de E/S no esperan a que se complete la operación antes de regresar, sino que simplemente organizan que se notifique a la persona que llama cuando eso suceda y que el resultado se devuelva en alguna parte. En JavaScript, la notificación generalmente se realiza invocando una devolución de llamada o resolviendo una promesa. En lo que respecta al programador, no importa cómo suceda esto: simplemente sucede. Solicito la operación, y cuando está hecha, me notifican.
Un bucle de eventos es la forma en que generalmente se logra esto. La cuestión es que, en la mayoría de las implementaciones de JavaScript, hay literalmente un bucle en algún lugar que finalmente se reduce a:
while (poll_event(&ev)) { dispatch_event(&ev); }Luego, la realización de una operación asincrónica se realiza organizando que la finalización de la operación sea recibida como un evento por ese bucle y que se envíe a una devolución de llamada a elección de la persona que llama.
Hay formas de lograr una programación asíncrona que no se base en un bucle de eventos, por ejemplo, utilizando subprocesos y variables de condición. Pero razones históricas hacen que este estilo de programación sea bastante difícil de realizar en JavaScript. Entonces, en la práctica, la implementación predominante de asincronía en JavaScript se basa en enviar devoluciones de llamada desde un bucle de eventos global.
Dicho de otra manera, 'el bucle de eventos' describe lo que hace el host, mientras que 'E/S asíncrona' describe lo que hace el programador.
Desde el punto de vista de un pájaro que no es programador, esto puede parecer una sutileza, pero la distinción puede ser ocasionalmente importante.
Durante años, JavaScript se ha limitado a las aplicaciones del lado del cliente, como las aplicaciones web interactivas que se ejecutan en el navegador. Usando NodeJS, JavaScript también se puede usar para desarrollar aplicaciones del lado del servidor. Aunque es el mismo lenguaje de programación que se usa en ambos casos de uso, el lado del cliente y el lado del servidor tienen requisitos diferentes.
“ Event Loop ” es un patrón de programación genérico y JavaScript/NodeJS
los bucles de eventos no son diferentes. El bucle de eventos observa continuamente cualquier controlador de eventos en cola y los procesará en consecuencia.
Los “ Eventos ”, en el contexto de un navegador, son interacciones del usuario en la web
páginas (p. ej., clics, movimientos del mouse, eventos del teclado, etc.), pero en
Contexto del nodo, los eventos son operaciones asíncronas del lado del servidor (por ejemplo, acceso de E/S de archivo, E/S de red, etc.)