‫Instructor: Bienvenido de nuevo.
‫Aprendamos ahora todo sobre el bucle de eventos, que
‫es el corazón de Node. js arquitectura.
‫Y esta es probablemente la conferencia
‫más importante de esta sección, así que asegúrese de
‫comprender realmente todo lo que le muestro durante este video.
‫Entonces empecemos.
‫Entonces, aquí hay un diagrama similar al de la
‫última conferencia para que sepamos exactamente de qué estamos hablando aquí.
‫Entonces, todavía estamos en un proceso de nodo en el único hilo
‫donde se ejecuta el ciclo de eventos, ¿de acuerdo?
‫Ahora, lo primero que debe saber
‫es que el bucle de eventos es donde se
‫ejecuta todo el código de
‫la aplicación que está dentro de las funciones de devolución de llamada.
‫Entonces, básicamente, todo el código que no sea de nivel superior se ejecutará
‫en el bucle de eventos.
‫Algunas partes pueden descargarse al grupo de subprocesos como vimos en
‫la última lección, pero es
‫el bucle de eventos el que se encarga de todo esto.
‫Como dije antes, realmente es el corazón
‫de la arquitectura Node.
‫Bien, ahora, como mencioné muchas veces en la primera parte
‫del curso, Node. js se basa en
‫funciones de devolución de llamada.
‫Por lo tanto, funciones que se
‫llaman tan pronto como se termina algún trabajo en el futuro.
‫¿Recuérdalo?
‫Y funciona de esta manera porque Node
‫usa una arquitectura activada por eventos, que
‫es algo de lo que hablaremos en uno
‫de los próximos videos.
‫Pero lo que necesita saber por
‫ahora es que cosas como
‫que nuestra aplicación reciba una solicitud HTTP en nuestro servidor o un temporizador que expire
‫o un archivo que termine de leerse, todos estos emitirán eventos tan
‫pronto como terminen con su trabajo, y nuestro
‫evento. loop luego recogerá estos eventos y llamará
‫a las funciones de
‫devolución de llamada que están asociadas con cada evento.
‫Vale, ¿tiene sentido?
‫Entonces, nuevamente, el bucle de eventos recibe eventos cada vez
‫que sucede algo importante, y luego
‫llamará a las devoluciones de llamada necesarias, como
‫las definimos en nuestro código.
‫Entonces, en resumen, generalmente se dice
‫que el bucle de eventos realiza la orquestación,
‫lo que simplemente significa que recibe eventos, llama
‫a sus funciones de devolución
‫de llamada y descarga las tareas más costosas al grupo de subprocesos.
‫Ahora bien, ¿cómo funciona todo esto detrás de escena?
‫¿En qué orden se ejecutan estas devoluciones de llamada?
‫Bueno, eso es lo que averiguaremos a continuación.
‫Entonces, recuerde, cuando iniciamos nuestra aplicación Node, el ciclo
‫de eventos comienza a ejecutarse de inmediato.
‫Ahora, el bucle de eventos tiene varias fases,
‫y cada fase tiene una cola de devolución de
‫llamada, que son las devoluciones de llamada que provienen de
‫los eventos que recibe
‫el bucle de eventos, tal como hablamos en la última diapositiva.
‫Ahora, en algunos lugares leerá que
‫solo hay una cola de devolución de llamada o una cola de eventos,
‫pero de hecho, como dije, el ciclo de eventos tiene muchas fases en las
‫que cada fase tiene su propia cola de devolución de llamada.
‫Entonces, ahora echemos un vistazo a las cuatro fases más importantes.
‫Hay una o dos fases más que
‫Node usa internamente, pero estas
‫no son tan importantes
‫y no voy a hablar de ellas.
‫Entonces, la primera fase
‫se encarga de las devoluciones de llamada de
‫los temporizadores caducados, por ejemplo, desde la función setTimeout ().
‫Entonces, si hay funciones de devolución de llamada de
‫temporizadores que acaban de expirar, estas son las primeras en
‫ser procesadas por el bucle de eventos.
‫Si un temporizador expira más tarde durante el tiempo en que
‫se está procesando una de las otras
‫fases, bueno, entonces la devolución de llamada de ese temporizador solo se
‫llamará tan pronto como el bucle de eventos vuelva a esta primera fase.
‫¿Tener sentido?
‫Y funciona así en las cuatro fases.
‫Por lo tanto, las devoluciones de llamada en cada
‫cola se procesan una por una hasta que no quedan nadie en
‫la cola, y solo entonces, el bucle de eventos entrará en la siguiente fase.
‫A continuación, tenemos el sondeo de E / S y la ejecución de devoluciones de llamada de E / S.
‫Y nuevamente, recuerde que E / S significa entrada / salida.
‫Entonces, el sondeo básicamente significa buscar nuevos eventos de E /
‫S que estén listos para ser
‫procesados y ponerlos en la cola de devolución de llamada.
‫Y recuerde que en el contexto de una aplicación Node,
‫E / S significa principalmente cosas como redes y acceso a archivos, por lo que
‫es en esta fase donde probablemente se ejecuta el 99% de
‫nuestro código, simplemente porque en
‫una aplicación Node típica, la mayor parte
‫de lo que tenemos que hacer está relacionado con la creación de
‫redes y también con el acceso a archivos.
‫La siguiente fase es para las devoluciones de llamada de setImmediate,
‫y setImmediate es un tipo especial de temporizador que
‫podemos usar si queremos procesar las devoluciones de llamada inmediatamente después de
‫la fase de ejecución y sondeo de E / S, que
‫puede ser importante en algunos casos de uso más avanzados.
‫Está bien.
‫Y finalmente, la cuarta fase es para devoluciones de llamada cercanas, que,
‫de nuevo, no son tan importantes para
‫nosotros, pero de todos modos pongo esto aquí para completarlo.
‫Básicamente, en esta fase, todos los eventos cercanos se
‫procesan, por ejemplo, cuando se apaga un servidor web o un WebSocket.
‫Entonces, estas son las cuatro fases en el bucle
‫de eventos, pero además de estas cuatro colas de devolución de
‫llamada que acabamos de ver, en realidad también
‫hay otras dos colas, la cola nextTick () y la
‫cola de otras microtasks, que es principalmente para promesas resueltas.
‫Si no está familiarizado con las
‫promesas, hablaremos un poco sobre ellas en una sección posterior.
‫De todos modos, si hay devoluciones de llamada
‫en una de estas dos colas para
‫ser procesadas, se ejecutarán justo después de que finalice la fase
‫actual del bucle de eventos en lugar de
‫esperar a que termine todo el bucle.
‫¿Okey?
‫Entonces, en otras palabras, después de cada una de
‫estas cuatro fases, si hay devoluciones de llamada en estas dos
‫colas especiales, se ejecutarán de inmediato.
‫Ahora, por ejemplo, imagine que una promesa se resuelve y
‫devuelve algunos datos de una llamada a la API mientras se está
‫ejecutando la devolución de llamada de un temporizador caducado.
‫Entonces, en este caso, la devolución de llamada de promesa se
‫ejecutará justo después de que finalice la del temporizador.
‫¿Okey?
‫Y la misma lógica también se aplica a la cola nextTick (),
‫de la que aún no hablamos.
‫Entonces, básicamente, procesar nextTick () es una función que podemos usar
‫cuando realmente, realmente necesitamos ejecutar una determinada devolución
‫de llamada justo después de
‫la fase de bucle de eventos actual.
‫Es un poco similar a setImmediate, con la diferencia de
‫que setImmediate solo se ejecuta después de la fase de devolución
‫de llamada de E / S.
‫Sin embargo, lo
‫que es similar es que ambos son para casos de uso realmente
‫avanzados, y probablemente ni siquiera los necesitemos a
‫lo largo de este curso.
‫Pero de todos modos, también quería incluir este material
‫más complejo aquí para que tenga
‫las herramientas que necesita si realmente
‫necesita profundizar en Node. js si quieres.
‫Muy bien, y con eso, en realidad terminamos un
‫tic del ciclo de eventos, y un tic es básicamente un ciclo
‫en este ciclo.
‫Entonces, ahora es el momento de decidir si el ciclo
‫debe continuar hasta el siguiente tick o si el programa debe salir.
‫¿Y cómo lo hace Node?
‫Bueno, es muy simple.
‫El nodo simplemente verifica si hay temporizadores o
‫tareas de E / S que aún se estén ejecutando
‫en segundo plano, y si no hay ninguno, saldrá de la aplicación.
‫Pero si hay temporizadores o tareas de E / S
‫pendientes, bueno, continuará ejecutando el ciclo
‫de eventos e irá directamente al siguiente tick.
‫Entonces, por ejemplo, cuando escuchamos
‫solicitudes HTTP entrantes como lo hicimos en nuestro proyecto de
‫granja de nodos en una sección anterior, básicamente estábamos ejecutando una
‫tarea de E / S, y es por eso que
‫el bucle de eventos y, por
‫lo tanto, Node. js, siga
‫ejecutándose y siga escuchando las nuevas solicitudes HTTP que ingresan
‫en lugar de simplemente salir de la aplicación.
‫Además, cuando escribimos o leemos un archivo
‫en segundo plano, también es una tarea de E /
‫S, por lo que tiene sentido que la aplicación
‫no se cierre mientras está trabajando con ese archivo, ¿verdad?
‫De acuerdo, y esto es básicamente lo que debes
‫saber sobre Node. bucle de eventos js.
‫Si necesita aún más detalles que esto, bueno,
‫siempre puede intentar leer
‫la documentación oficial de Node, que debería ser bastante fácil
‫de entender en este punto ahora que
‫ya comprende la mayor parte del ciclo de eventos de todos modos.
‫Y solo quiero enfatizar que es
‫realmente muy importante para usted comprender correctamente el ciclo de
‫eventos para que pueda escribir su propio
‫código de ejecución y también depurar su propio código
‫cuando algo sale mal de una manera inesperada.
‫Y ahora, para terminar, repasemos algunas de las
‫cosas de las que hablamos aquí.
‫Entonces, en pocas palabras, lo más importante que quiero que
‫comprendan de esta conferencia, y tal vez de
‫todo este curso, es que el bucle de
‫eventos es lo que hace posible
‫la programación asincrónica en Node. js, lo que la convierte
‫en la característica más importante en el diseño de Node y
‫hace que Node. js completamente
‫diferente a otras plataformas.
‫Se encarga de todos los eventos entrantes
‫y realiza la orquestación descargando tareas más pesadas en el
‫grupo de subprocesos y haciendo el trabajo más simple por sí mismo.
‫Además, recuerde que necesitamos el ciclo de
‫eventos porque en Node. js todo funciona en un
‫solo hilo, por lo que puede
‫tener miles o millones de usuarios accediendo al mismo hilo al mismo tiempo.
‫Esto hace que Node sea tan liviano y
‫escalable, pero al mismo tiempo, conlleva el peligro
‫de bloquear nuestro único
‫hilo, lo que ralentizaría toda la
‫aplicación o incluso se detendría para que todos sus usuarios accedan a la aplicación, ¿verdad?
‫Ahora, en otros lenguajes como PHP que
‫se ejecuta en un servidor Apache, básicamente, se crea
‫un nuevo hilo para cada nuevo usuario, lo que consume más recursos.
‫Pero por otro lado, no
‫hay peligro de bloqueo, ¿verdad?
‫Entonces, todo ese modelo hace que sea
‫un poco más fácil de usar PHP para principiantes, pero
‫por supuesto, tiene sus propias desventajas,
‫que no voy a profundizar en este punto.
‫De todos modos, permítame
‫recordarle nuevamente que es su responsabilidad no bloquear el bucle de eventos, por
‫lo que aquí hay un par de pautas para eso.
‫En primer lugar, no use las versiones
‫de sincronización de funciones en los módulos fs,
‫crypto o zlib en sus funciones de devolución de llamada, ¿de acuerdo?
‫Entonces, en nuestro primer proyecto, usamos la versión síncrona,
‫pero estaba en el código de nivel superior, por lo que
‫fuera de cualquier devolución de llamada.
‫Y dado que ese código se ejecuta incluso antes de que comience
‫el bucle de eventos, bueno, no es un problema usar la versión síncrona allí.
‫Además, y esto probablemente sea bastante obvio,
‫no realice cálculos muy complejos en el ciclo de eventos.
‫Entonces, cosas como procesar
‫millones de números en bucles dentro de bucles, o algo así.
‫A continuación, tenga cuidado con JSON en objetos muy grandes
‫porque, en algún momento, puede comenzar
‫a tomar mucho tiempo analizar o secuenciar JSON.
‫Y, por último, no utilice expresiones regulares demasiado complejas,
‫por ejemplo, con varios cuantificadores anidados
‫o referencias inversas, porque de
‫nuevo, pueden tardar más de lo esperado.
‫Estas son, por supuesto, solo un par
‫de pautas de alto nivel, pero lo ayudarán a comenzar en
‫el camino correcto.
‫Ahora, existen algunas soluciones potenciales
‫a estos problemas de bloqueo, como la descarga manual al
‫grupo de subprocesos o el uso de procesos secundarios, y podríamos
‫hablar de esto al final del curso
‫o en algún momento en el futuro,
‫pero por ahora, es importante que entiende y sigue este
‫consejo de no bloquear realmente el ciclo de eventos.
‫Está bien.
‫A continuación, les daré un pequeño ejemplo para mostrarles algunas
‫de las cosas de
‫las que hablamos en la práctica.