Paquetes PyPI
A partir de junio de 2020, estos son los paquetes relacionados con eventos disponibles en PyPI, ordenados por la fecha de lanzamiento más reciente.
Hay más
Hay muchas bibliotecas para elegir, usando una terminología muy diferente (eventos, señales, controladores, envío de métodos, ganchos, ...).
Estoy tratando de mantener una visión general de los paquetes anteriores, además de las técnicas mencionadas en las respuestas aquí.
Primero, algo de terminología ...
Patrón de observador
El estilo más básico del sistema de eventos es la 'bolsa de métodos de manejo', que es una implementación simple del patrón Observador .
Básicamente, los métodos del controlador (invocables) se almacenan en una matriz y cada uno de ellos se llama cuando el evento 'se dispara'.
Publicar-Suscribirse
La desventaja de los sistemas de eventos de Observer es que solo puede registrar los controladores en el objeto Evento real (o en la lista de controladores). Entonces, en el momento de la inscripción, el evento ya debe existir.
Es por eso que existe el segundo estilo de sistemas de eventos: el
patrón de publicación-suscripción . Aquí, los controladores no se registran en un objeto de evento (o lista de controladores), sino en un distribuidor central. Además, los notificadores solo hablan con el despachador. Qué escuchar o qué publicar está determinado por la 'señal', que no es más que un nombre (cadena).
Patrón de mediador
También podría ser de interés: el patrón Mediador .
Manos
Un sistema 'enganchado' se usa habitualmente en el contexto de complementos de aplicaciones. La aplicación contiene puntos de integración fijos (ganchos), y cada complemento puede conectarse a ese gancho y realizar ciertas acciones.
Otros eventos'
Nota: threading.Event no es un 'sistema de eventos' en el sentido anterior. Es un sistema de sincronización de hilos donde un hilo espera hasta que otro hilo 'señale' el objeto Evento.
Las bibliotecas de mensajería de red a menudo usan el término 'eventos' también; a veces estos son similares en concepto; a veces no. Por supuesto, pueden atravesar límites de hilos, procesos y computadoras. Ver, por ejemplo
, pyzmq , pymq ,
Twisted , Tornado , gevent , eventlet .
Referencias débiles
En Python, mantener una referencia a un método u objeto asegura que el recolector de basura no lo eliminará. Esto puede ser deseable, pero también puede provocar pérdidas de memoria: los controladores vinculados nunca se limpian.
Algunos sistemas de eventos usan referencias débiles en lugar de regulares para resolver esto.
Algunas palabras sobre las diferentes bibliotecas.
Sistemas de eventos estilo observador:
- zope.event muestra los aspectos básicos de cómo funciona esto (ver la respuesta de Lennart ). Nota: este ejemplo ni siquiera admite argumentos de manejador.
- La implementación de 'lista invocable' de LongPoke muestra que dicho sistema de eventos puede implementarse de manera muy minimalista mediante la subclasificación
list
.
- La variación de Felk EventHook también garantiza las firmas de los callejeros y las personas que llaman.
- El EventHook de spassig (Patrón de eventos de Michael Foord) es una implementación sencilla.
- La clase Evento de Lecciones Valoradas de Josip es básicamente la misma, pero usa un en
set
lugar de un list
para almacenar la bolsa, e implementos __call__
que son adiciones razonables.
- PyNotify es similar en concepto y también proporciona conceptos adicionales de variables y condiciones ('evento de cambio de variable'). La página de inicio no es funcional.
- Axel es básicamente una bolsa de manipuladores con más características relacionadas con el enhebrado, el manejo de errores, ...
- python-dispatch requiere que se deriven las clases de origen pares
pydispatch.Dispatcher
.
- buslane está basado en clases, admite manejadores únicos o múltiples y facilita sugerencias de tipo extensas.
- El observador / evento de Pithikos es un diseño liviano.
Bibliotecas de publicación y suscripción:
- Blinker tiene algunas características ingeniosas, como la desconexión automática y el filtrado basado en el remitente.
- PyPubSub es un paquete estable y promete "características avanzadas que facilitan la depuración y el mantenimiento de temas y mensajes".
- pymitter es un puerto Python de Node.js EventEmitter2 y ofrece espacios de nombres, comodines y TTL.
- PyDispatcher parece enfatizar la flexibilidad con respecto a la publicación de muchos a muchos, etc. Admite referencias débiles.
- louie es un PyDispatcher reelaborado y debería funcionar "en una amplia variedad de contextos".
- pypydispatcher se basa en PyDispatcher (lo has adivinado ...) y también funciona en PyPy.
- django.dispatch es un PyDispatcher reescrito "con una interfaz más limitada, pero de mayor rendimiento".
- pyeventdispatcher se basa en el despachador de eventos del framework Symfony de PHP.
- el despachador se extrajo de django.dispatch pero se está volviendo bastante viejo.
- El EventManger de Cristian García es una implementación realmente corta.
Otros:
- Pluggy contiene un sistema de gancho que utilizan los
pytest
complementos.
- RxPy3 implementa el patrón Observable y permite fusionar eventos, reintentar, etc.
- Las señales y ranuras de Qt están disponibles en PyQt
o PySide2 . Funcionan como devolución de llamada cuando se usan en el mismo hilo o como eventos (usando un bucle de eventos) entre dos hilos diferentes. Las señales y las ranuras tienen la limitación de que solo funcionan en objetos de clases que se derivan
QObject
.