es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo es que el bucle de eventos nunca se bloquea pero los mensajes en la cola se ejecutan hasta completarse?

Estaba aprendiendo sobre el event loop de JavaScript en la documentación de MDN. Se mencionó que un mensaje en la cola se ejecuta por completo, pero al final se dijo que el event loop nunca se bloquea. Realmente no entiendo esto, ¿no es una contradicción? Por favor, ayúdeme a entender la diferencia entre ellos.

“Run-to-completion”

Cada mensaje se procesa por completo antes de que se procese cualquier otro mensaje. Esto ofrece algunas propiedades agradables al razonar sobre su programa, incluyendo el hecho de que cada vez que una función se ejecuta, no puede ser interrumpida y se ejecutará completamente antes de que se ejecute cualquier otro código (y puede modificar los datos que la función manipula). Esto difiere de C, por ejemplo, donde si una función se ejecuta en un hilo, puede ser detenida en cualquier punto por el sistema de tiempo de ejecución para ejecutar otro código en otro hilo.

Una desventaja de este modelo es que si un mensaje tarda demasiado en completarse, la aplicación web no podrá procesar interacciones del usuario como hacer clic o desplazarse. El navegador mitiga esto con el diálogo “el script está tardando demasiado en ejecutarse”. Una buena práctica a seguir es hacer que el procesamiento de mensajes sea corto y, si es posible, dividir un mensaje en varios mensajes.

Never blocking

Una propiedad muy interesante del modelo de event loop es que JavaScript, a diferencia de muchos otros lenguajes, nunca se bloquea. El manejo de E/S se realiza típicamente a través de eventos y devoluciones de llamada, por lo que cuando la aplicación está esperando que un procedimiento de IndexedDB o una solicitud XHR finalice, aún puede procesar cosas como la entrada del usuario.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Las propiedades “run-to-completion” y “never blocking” del bucle de eventos no son contradictorias, sino que funcionan juntas para garantizar el procesamiento eficiente y continuo de los mensajes en la cola. “Run-to-completion” significa que un mensaje se procesa por completo antes de que se procese cualquier otro mensaje, permitiendo garantizar que una función se ejecute por completo sin ser interrumpida por otro código. Por otro lado, “never blocking” significa que incluso cuando un mensaje tarda mucho tiempo en completarse, el bucle de eventos aún puede procesar otras cosas como las entradas de usuario a través de eventos y devoluciones de llamada. Esta propiedad garantiza que la aplicación web siga siendo receptiva para el usuario, incluso cuando se manejan operaciones de entrada/salida (I/O). Por lo tanto, mientras un mensaje se procesa por completo, el bucle de eventos nunca está bloqueado y puede continuar manejando otros eventos en la cola.

Comments are closed.