Red de conocimiento informático - Aprendizaje de programación - bucle de eventos js

bucle de eventos js

El bucle de eventos (o bucle de eventos) es un mecanismo para resolver el problema de bloqueo de JavaScript que se ejecuta en un solo hilo. Está diseñado principalmente para coordinar el comportamiento de eventos, interacciones del usuario, scripts, representación de la interfaz de usuario y procesamiento de red en un solo hilo para evitar que el hilo principal se bloquee.

Dado que JavaScript es de un solo subproceso, esto significa que todas las tareas deben estar en cola y la tarea anterior debe haber finalizado antes de que se pueda ejecutar la siguiente.

Pero los dispositivos IO (dispositivos de entrada y salida) pueden volverse lentos debido a la red y otros factores (como Ajax), de modo que la CPU no se puede utilizar por completo, por lo que los diseñadores asignarán las tareas de los dispositivos IO a Mantenga presionado Levántese, ejecute las tareas posteriores primero y luego regrese a las tareas pendientes cuando el dispositivo IO devuelva los resultados. Por lo tanto, todas las tareas se dividen en dos tipos, una es tarea sincrónica y la otra es tarea asincrónica.

La siguiente tarea solo se puede ejecutar después de que se haya ejecutado la tarea anterior; la siguiente tarea se pone en cola directamente en el hilo principal y se ejecuta primero, formando una pila de ejecución

No ingrese el hilo principal Las tareas que ingresan a la cola de tareas solo ingresarán al hilo principal cuando la cola de tareas notifique al hilo principal que la tarea asincrónica está lista.

(1) La cola de tareas es una tarea en el hilo principal.

(1) Todas las tareas de sincronización se ejecutan en el hilo principal, formando una pila de contexto de ejecución.

(2) Fuera del hilo principal, también hay una "cola de tareas". Siempre que una tarea asincrónica tiene un resultado, se coloca un evento en la cola de tareas.

(3) Después de ejecutar todas las tareas de sincronización en la pila de ejecución, el sistema leerá la cola de tareas y ejecutará la macrotarea. Si se encuentra una microtarea durante la ejecución, se agregará a la microtarea. tarea Una vez ejecutadas las macrotareas en la cola de tareas, el sistema ejecutará todas las microtareas en la cola de microtareas en secuencia. El subproceso de la GUI se hace cargo del procesamiento. Una vez completado el procesamiento, el subproceso JS continúa asumiendo el control e inicia la siguiente tarea macro (desde la cola de eventos)

(4) El subproceso principal continúa repitiendo el tercer paso. arriba.

La "cola de tareas" es una estructura de datos FIFO y una cola de eventos (también entendida como cola de mensajes). Cuando el dispositivo IO completa una tarea, se agrega un evento a la "cola de tareas" que indica que la tarea asincrónica relacionada está lista para ingresar a la "pila de ejecución". Cuando el hilo principal lee la cola de tareas, lee los eventos que contiene.

Los eventos en la "Cola de tareas" incluyen no solo eventos del dispositivo IO, sino también algunos eventos generados por el usuario (como clics del mouse, desplazamiento de página, etc.). Siempre que se especifique una función de devolución de llamada, estos eventos ingresarán a la "cola de tareas" cuando ocurran, esperando ser leídos por el hilo principal.

Una devolución de llamada es un código que se cuelga en el hilo principal. La tarea asincrónica debe especificar una función de devolución de llamada. Cuando el hilo principal comience a ejecutar la tarea asincrónica, ejecutará la función de devolución de llamada correspondiente.

Ejemplo 1

Ejemplo 2:

Ejemplo 3:

El bucle de eventos de nodejs es diferente del bucle de eventos del navegador. El bucle de eventos del navegador es una especificación definida en HTML5 y en el nodo lo implementa la biblioteca libuv.