El bucle de eventos de NodeJS es diferente del mecanismo de bucle de eventos del navegador. Antes de explicarlo, debe establecer un poco de conocimiento adicional.

E/S asíncrona

E/S se refiere a las capacidades de E/S (entrada y salida de datos) proporcionadas por el sistema operativo, como entrada de teclado, habrá una interfaz especial de salida de datos en la pantalla, esta interfaz ingresará al nivel del sistema operativo hacia abajo y el sistema operativo system system proporcionará muchas capacidades de E/S, como lectura y escritura de disco, consultas de DNS, conexiones de base de datos, solicitudes de red, etc.


La E/S se puede considerar como la interacción de datos entre la aplicación de la capa superior y el sistema de la capa inferior. La capa superior depende de la capa inferior, y la capa superior también puede transformar las capacidades proporcionadas por la capa inferior. Según si está bloqueado de forma asíncrona, se puede dividir en el modelo de E/S asíncrono sin bloqueo y el modelo de E/S síncrono de bloqueo síncrono. Por ejemplo, readFile de NodeJS es una interfaz asíncrona sin bloqueo y readFileSync es una interfaz síncrona de bloqueo.

Arquitectura NodeJS


imagen

Esta imagen es la arquitectura NodeJS NodeJS se divide en cuatro capas, a saber, la capa de aplicación, la capa del motor V8, la capa API de NodeJS y la capa libuv.

  • Capa de aplicación: la capa de interacción de JavaScript, los más comunes son los módulos de NodeJS, como http, fs

  • Capa de motor V8: use el motor V8 para analizar la sintaxis de JavaScript y luego interactúe con la API de nivel inferior

  • Capa API de nodo: proporciona llamadas al sistema para módulos de nivel superior, generalmente implementados por lenguaje C, e interactúa con el sistema operativo

  • capa libuv: es la encapsulación inferior de multiplataforma, realiza bucle de eventos, operación de archivos, etc. Es el núcleo de NodeJS para lograr asincrónico

bucle de eventos

NodeJS realiza operaciones de E/S sin bloqueo y, aunque JavaScript es de subproceso único, dado que la mayoría de los núcleos son de subprocesos múltiples, NodeJs cargará operaciones en el núcleo del sistema siempre que sea posible. Por lo tanto, es posible manejar múltiples operaciones realizadas en segundo plano, cuando una de sus operaciones se completa, el kernel notifica a NodeJS para que Node.js pueda agregar la devolución de llamada correspondiente a la cola de sondeo para una eventual ejecución.

NodeJS inicializará el bucle de eventos cuando se inicie, y cada bucle de eventos contendrá 6 etapas de bucle

┌─── razón
_
─── ─────ella


┌ razón ───── ──┬─ig
. ────┐
│ │ │ inactivo, prepara │
│ └ ─ versión ────── razón
_
──┤ conexiones, │ │
└──────────┬── ──────────┘ │ datos, etc.
"
_
_ "
_
_ cerrar devoluciones
de llamada

La siguiente es una descripción detallada de las operaciones realizadas en varias etapas.

etapa de temporizadores

En esta etapa, se ejecutan las devoluciones de llamada programadas de setTimeOut (devolución de llamada) y setInterval (devolución de llamada), y el tiempo especificado por el temporizador no es el tiempo exacto de ejecución de la devolución de llamada, sino un límite inferior. Después del tiempo especificado, los temporizadores se ejecutarán la devolución de llamada lo antes posible y los retrasos debidos a la programación del sistema o a la ejecución de otras devoluciones de llamada

Etapa de devoluciones de llamada de E/S

Esta fase realiza devoluciones de llamada para ciertas operaciones del sistema, como tipos de errores de TCP. Por ejemplo, cuando se rechaza una conexión TCP, la devolución de llamada de este tipo de operación se ejecutará en la etapa de devolución de llamada de E/S. Esto no significa que todas las devoluciones de llamada de E/S se ejecuten en esta etapa. La devolución de llamada se procesará en la etapa de encuesta.

inactivo, preparar etapa:

Esta etapa solo se usa internamente por nodo;

fase de sondeo: obtener nuevos eventos de E/S

La fase de encuesta tiene dos funciones principales: 

(1) Ejecutar la devolución de llamada de los temporizadores cuyo tiempo límite inferior haya alcanzado, 

(2) Luego procese los eventos en la cola de sondeo.

etapa de control:

Esta fase permite que las devoluciones de llamada se ejecuten inmediatamente después de que finalice la fase de encuesta. Si la fase de sondeo está inactiva y setImmediate() establece una devolución de llamada, el bucle de eventos irá a la fase de verificación en lugar de esperar.

cerrar la etapa de devolución de llamadas:

Por ejemplo, la devolución de llamada de socket.on('cerrar', devolución de llamada) se ejecutará en esta etapa;

Documentación de referencia

  • Bucle de eventos de Node.js, temporizadores y proceso.nextTick()

  • Análisis en profundidad del bucle de eventos y la cola de mensajes de Node.js