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.

Libevent – Ejecutando el bucle (event_base_loop)

Por favor, hágame saber, aquí hay una cita de la sección 3 (“Ejecutando un bucle de eventos“) de libro sobre Libevent de Nick Mathewson:

De forma predeterminada, la función event_base_loop() ejecuta un event_base hasta que no haya más eventos registrados en él.

Honestamente, no puedo entender esta frase.

¿Qué significa “hasta que no haya más eventos registrados”?

¿Cómo sabe el bucle que no hay más eventos nuevos? Puede haber un intervalo de tiempo entre eventos: 1 segundo, 1 hora…

¿Cómo sabe Libevent que los eventos han terminado?

PD: Estoy intentando comparar el funcionamiento de la función event_base_loop() con la función GetQueuedCompletionStatus() en Windows y no lo entiendo. Porque GetQueuedCompletionStatus funciona en un bucle infinito, tanto si hay eventos como si no los hay. GetQueuedCompletionStatus espera infinitamente un nuevo evento y no finaliza si no hay ninguno.

PD1: Tuve prisa y no terminé el capítulo sobre “Trabajar con un bucle de eventos”.

Dice que se puede redefinir el comportamiento de la función event_base_loop() pasándole una bandera en el segundo parámetro – EVLOOP_NOEXITONEMPTY.

Esto significará que la función esperará indefinidamente nuevos eventos o hasta que decida salir del bucle event_base_loop() manualmente a través de event_base_loopbreak / event_base_loopexit.

Tags:  ,

Answer

  1. Avatar for davy.ai

    La cita de la sección de referencia 3 del libro de Nick Mathewson sobre Libevent significa que la función event_base_loop() seguirá ejecutándose hasta que no haya más eventos registrados en la base de eventos. Esencialmente, el bucle seguirá ejecutándose siempre y cuando haya eventos que procesar.

    Para responder a tu pregunta sobre cómo sabe el bucle cuándo no hay más eventos, depende de cómo se registran los eventos en primer lugar. Si los eventos se registran con un temporizador o timeout, entonces el bucle esperará el período de tiempo especificado antes de comprobar si hay nuevos eventos. Si los eventos se registran con un descriptor de archivo o socket, entonces el bucle esperará actividad de E/S en esos descriptores.

    Libevent mantiene un seguimiento de los eventos en su lista de eventos. Cuando se registra un evento con Libevent, se añade a esta lista. Cuando el evento se ha completado, se elimina de la lista. Cuando la lista de eventos está vacía, el bucle saldrá por defecto.

    Sin embargo, como se menciona en el post-scriptum, puedes redefinir el comportamiento de la función event_base_loop() pasando la bandera EVLOOP_NO_EXIT_ON_EMPTY como segundo parámetro. Esto hará que el bucle espere nuevos eventos indefinidamente o hasta que salgas manualmente del bucle usando event_base_loopbreak() o event_base_loopexit().

    En comparación con la función GetQueuedCompletionStatus() en Windows, la función event_base_loop() en Libevent permite más flexibilidad en cómo se ejecuta el bucle. Por defecto, el bucle saldrá cuando no haya más eventos, pero puedes cambiar este comportamiento si es necesario.

    En general, el concepto de un bucle de eventos es un aspecto fundamental de la programación orientada a eventos y se utiliza en muchos lenguajes y frameworks de programación diferentes.

Comments are closed.