10

He estado buscando en Node.JS y toda la documentación y blogs hablan sobre cómo se utiliza un bucle de eventos en lugar de un modelo por solicitud.¿Qué es un evento de bucle y cómo es diferente de usar otros modelos?

Estoy teniendo algo de confusión para entender la diferencia. Siento que estoy 80% entendiéndolo pero sin obtenerlo por completo todavía.

+0

¿Tal vez sea un poco más específico sobre lo que no entiende? – igorw

Respuesta

17

Un modelo con hilos generará un nuevo hilo para cada solicitud. Esto significa que obtiene bastante sobrecarga en términos de computación y memoria. Un bucle de evento se ejecuta en un único hilo, lo que significa que no obtiene la sobrecarga.

El resultado de esto es que debe cambiar su modelo de programación. Debido a que todas estas cosas diferentes están sucediendo en el mismo hilo, no puedes bloquear. Esto significa que no puede esperar a que suceda algo porque eso bloquearía todo el hilo. En su lugar, define una devolución de llamada que se llama una vez que se completa la acción. Esto se conoce como E/S sin bloqueo.

Pseudo ejemplo para el bloqueo de I/O:

row = db_query('SELECT * FROM some_table'); 
print(row); 

Pseudo ejemplo para no bloqueante I/O:

db_query('SELECT * FROM some_table', function (row) { 
    print(row); 
}); 

Este ejemplo utiliza lambdas (funciones anónimas) como los que se utilizan en JavaScript todo el tiempo. JS hace un uso intensivo de los eventos, y eso es exactamente de lo que se trata la devolución de llamada. Una vez que se completa la acción, se activa un evento que desencadena la devolución de llamada. Esta es la razón por la cual a menudo se la conoce como modelo con vértigo o también modelo asíncrono.

La implementación de este modelo utiliza un ciclo que procesa y desencadena estos eventos. Es por eso que se llama cola de eventos o evento de ciclo.

Ejemplos prominentes de los marcos de colas de eventos incluyen:

+2

Creo que es importante destacar que una cola de eventos no implica la ausencia de grupos de subprocesos. Por ejemplo, node.js usa mucho pools de hilos para bloquear operaciones internamente. Lo que el modelo de cola de eventos llama es la forma de cómo interactuar con tales acciones de larga duración. –

6

Considere las solicitudes entrantes o las devoluciones de llamadas como eventos, que se ponen en cola y se procesan.

Eso es exactamente lo mismo que se hace en la mayoría de los sistemas de GUI. El sistema no puede saber cuándo un usuario hará clic en un botón o realizará alguna interacción. Pero cuando lo hace, el evento se propagará al bucle de evento, que básicamente es un bucle que busca nuevos eventos en la cola y los procesa.

La ventaja es que no tiene que esperar los resultados usted mismo. En cambio, registra funciones de devolución de llamada que se ejecutan cuando se desencadena el evento. Esto permite que el marco maneje las cosas de E/S y puede confiar fácilmente en su eficiencia interna cuando se trata de acciones de toma prolongada en lugar de bloquear procesos por su cuenta.

En resumen, todo funciona en paralelo pero su código. Nunca habrá dos fragmentos de funciones de devolución de llamada que se ejecuten simultáneamente: el bucle de evento es un único hilo. Los procesos que ejecutan cosas externamente y finalmente propagan eventos pueden ser distribuidos en múltiples hilos/procesos.

+0

"Los procesos que ejecutan cosas externamente y finalmente propagan eventos pueden ser distribuidos en múltiples hilos/procesos". ¿Esto también es cierto para el motor JS vainilla (es decir, no nodo)? Porque yo mismo he estado pensando lo mismo ... la propagación de eventos y las solicitudes externas DEBEN ser manejadas por hilos separados, incluso si el hilo que ejecuta el código JS real es solo uno. Pero todo lo que leo dice que incluso el motor JS ** es de un solo hilo, lo cual me parece increíble. – The111

0

Un bucle evented permite a manejar el tiempo que lleva hablar con el disco duro o la red. tome esta lista de tiempo:

Source | CPU Cycles 
L1  | 3 Cycles 
L2  | 14 Cycles 
RAM | 250 Cycles 
Disk | 41,000,000 Cycles 
Network| 240,000,000 Cycles 

Esa vez que está ejecutando curl en PHP está desperdiciando CPU.

Cuestiones relacionadas