Una aplicación web de Javascript tiene un ciclo de eventos para manejar la pila de llamadas y se repite para verificar si hay colas de tareas devueltas por la API web del navegador para ejecutarse cuando la pila de llamadas está libre. Usaré v8 como ejemplo para el motor de javascript.
Siempre me he imaginado esta pila de llamadas como parte del motor V8, en última instancia, ejecuta nuestro Javascript como un programa síncrono. Cualquier delegación de acción de subprocesos múltiples a una API como libuv/libevent debe regresar a la pila de llamadas de ejecución de V8 mediante un procesamiento asíncrono.
Pero recientemente, leí chromium y node.js usa el bucle de eventos proporcionado por libevent/libuv sobre la implementación de v8. Esta parte realmente interfiere un poco con mi modelo mental. El bucle de eventos es la solución perfecta para obtener un procesamiento asíncrono cuando reside en v8, esperamos que la API devuelva una cola a nuestra macro/microtarea y las ejecute en el siguiente bucle alrededor de la verificación de prioridad.
¿Por qué necesitamos sacarlo de v8 (ya que la mayoría de los diagramas muestran que el bucle de eventos reside fuera de v8)? si el bucle de eventos está fuera de v8, ¿significa que v8 ya no está ejecutando el código javascript, sino que el bucle de eventos externo ejecuta nuestro programa Javascript y otros códigos proporcionados por las bibliotecas respectivas?
Francamente, esta es también la primera vez que sé que el componente de bucle de eventos no es parte de v8.
Pero no tengo problemas para entender que podemos sacarlo de v8. Sé que no soy autoritario, pero aquí estoy compartiendo mi comprensión contigo:
Su modelo de mente anterior es como v8, bucles activamente ocupados para verificar la señal de continuación.
En el nuevo modelo, esa responsabilidad es simplemente cambiar a libuv, v8 registra una devolución de llamada a libuv, diciendo que "Estoy esperando la señal de una determinada interrupción de E/S de archivo/red/tiempo de espera, llámame cuando suceda", y luego, v8 se duerme, dejando a libuv ocupado en bucle.
Cuando llega esa señal, libuv devuelve la llamada a v8 para activarlo, y v8 continúa ejecutando tareas JS. Así que no, libuv no ejecuta JavaScript, sigue siendo v8.
Lo único que cambió es dónde colocar el código de bucle. Esto es solo una cuestión de dónde dibujar el límite entre los componentes del software.