events - muestrales - introduccion ala probabilidad y estadistica mendenhall 13th pdf
¿Cuál es la diferencia entre el modelo impulsado por evento y el patrón de reactor? (2)
Creo que esta separación "no bloqueante" y "asincrónica" es incorrecta, ya que la principal implicación de "asíncrono" es "no bloqueante". El patrón de reactor se trata de llamadas asíncronas (por lo que no bloquea), pero el procesamiento síncrono (de bloqueo) de esas llamadas. Proactor trata sobre llamadas asincrónicas (no bloqueantes) y el procesamiento asincrónico (sin bloqueo) de esas llamadas.
Del artículo de la wikipedia Reactor Pattern :
El patrón de diseño del reactor es un patrón de manejo de eventos para manejar solicitudes de servicio entregadas concurrentemente a un controlador de servicio por una o más entradas.
Nombró algunos ejemplos, p. Ej. nodejs
, twisted
, eventmachine
Pero lo que entiendo que arriba es el marco impulsado por eventos populares, entonces ¿los convierte también en un marco de patrón de reactor?
¿Cómo diferenciar entre estos dos? ¿O son lo mismo?
El patrón del reactor es más específico que la "programación impulsada por eventos". Es una técnica de implementación específica que se usa cuando se realiza una programación basada en eventos. Sin embargo, el término no se usa con mucha precisión en las conversaciones típicas, por lo que debe tener cuidado al usarlo y esperar que su público lo entienda, y debe tener cuidado con la forma de interpretar el término cuando lo encuentre.
Una forma de ver el patrón del reactor es considerarlo estrechamente relacionado con la idea de las operaciones "sin bloqueo". El reactor envía notificaciones cuando ciertas operaciones se pueden completar sin bloqueo. Por ejemplo, select(2)
se puede usar para implementar el patrón de reactor para leer y escribir en sockets usando las API de socket BSD estándar ( recv(2)
, send(2)
, etc.). select
le dirá cuándo puede recibir bytes de un socket instantáneamente, ya que los bytes están presentes en el buffer del kernel receptor para ese socket, por ejemplo.
Otro patrón que quizás desee considerar al pensar en estas ideas es el patrón proactor . En contraste con el patrón del reactor, el patrón del proactor tiene operaciones que comienzan sin importar si pueden terminar de inmediato o no, las realiza de forma asíncrona y luego organiza la notificación de su finalización.
La API Puertos de finalización de E / S de Windows (IOCP) es un ejemplo donde se puede ver el patrón del proactor . Al realizar un envío en un socket con IOCP, la operación de envío se inicia independientemente de si hay espacio en el buffer de envío del núcleo para ese socket. La operación de envío continúa (en otro hilo, tal vez un hilo en el kernel) mientras que la llamada WSASend
completa inmediatamente. Cuando el envío realmente se completa (lo que significa que los bytes que se envían se han copiado en el buffer de envío del núcleo para ese socket), se invoca una función de devolución de llamada a la llamada WSASend
(en un nuevo hilo en la aplicación).
Este enfoque de iniciar operaciones y luego recibir una notificación cuando están completas es fundamental para la idea de las operaciones asincrónicas . Compáralo con operaciones sin bloqueo donde esperas hasta que una operación se complete inmediatamente antes de intentar realizarla.
Cualquiera de los enfoques se puede usar para la programación impulsada por eventos. Usando el patrón del reactor, un programa espera el evento de (por ejemplo) que un socket sea legible y luego lee de él. Usando el patrón de proactor, el programa espera el evento de una lectura de socket completando.
Estrictamente hablando, Twisted hace mal uso del término reactor . El reactor Twisted que se basa en select(2)
( twisted.internet.selectreactor
) se implementa utilizando E / S sin bloqueo, que es muy parecido a un reactor. Sin embargo, la interfaz que expone al código de la aplicación es asíncrona , lo que la hace más parecida a un proactor. Twisted también tiene un reactor basado en IOCP. Este reactor expone la misma API asincrónica orientada a la aplicación y utiliza las API IOCP similares a un proactor. Este enfoque híbrido, que varía de una plataforma a otra en sus detalles, hace que ni el término "reactor" ni el "proactor" sean particularmente precisos, pero dado que la API expuesta por twisted.internet.reactor
es básicamente completamente asincrónica en lugar de no bloqueadora, proactor haría probablemente haya sido una mejor elección de nombre.