Forfaits PyPI
En date de juin 2020, ce sont les packages liés à l'événement disponibles sur PyPI, classés par date de sortie la plus récente.
Il y a plus
C'est beaucoup de bibliothèques à choisir, en utilisant une terminologie très différente (événements, signaux, gestionnaires, répartition des méthodes, hooks, ...).
J'essaie de garder un aperçu des packages ci-dessus, ainsi que des techniques mentionnées dans les réponses ici.
Tout d'abord, une terminologie ...
Modèle d'observateur
Le style le plus élémentaire du système d'événements est le «sac de méthodes de gestion», qui est une implémentation simple du modèle Observer .
Fondamentalement, les méthodes de gestionnaire (callables) sont stockées dans un tableau et sont chacune appelées lorsque l'événement se déclenche.
Publier-s'abonner
L'inconvénient des systèmes d'événements Observer est que vous ne pouvez enregistrer les gestionnaires que sur l'objet Event réel (ou la liste des gestionnaires). Donc, au moment de l'inscription, l'événement doit déjà exister.
C'est pourquoi le deuxième style de systèmes d'événements existe: le
modèle de publication-abonnement . Ici, les gestionnaires ne s'inscrivent pas sur un objet événement (ou une liste de gestionnaires), mais sur un répartiteur central. De plus, les notifiants ne parlent qu'au répartiteur. Ce à écouter ou à publier est déterminé par le «signal», qui n'est rien de plus qu'un nom (chaîne).
Motif médiateur
Peut-être aussi intéressant: le modèle Mediator .
Crochets
Un système «hook» est généralement utilisé dans le contexte des plugins d'application. L'application contient des points d'intégration fixes (hooks), et chaque plug-in peut se connecter à ce hook et effectuer certaines actions.
Autres événements'
Remarque: threading.Event n'est pas un «système d'événements» dans le sens ci-dessus. C'est un système de synchronisation de threads où un thread attend qu'un autre thread «signale» l'objet Event.
Les bibliothèques de messagerie réseau utilisent souvent aussi le terme «événements»; parfois ceux-ci sont similaires dans leur concept; parfois non. Ils peuvent bien sûr franchir les limites des threads, des processus et des ordinateurs. Voir par exemple
pyzmq , pymq ,
Twisted , Tornado , gevent , eventlet .
Références faibles
En Python, détenir une référence à une méthode ou un objet garantit qu'il ne sera pas supprimé par le garbage collector. Cela peut être souhaitable, mais cela peut également entraîner des fuites de mémoire: les gestionnaires liés ne sont jamais nettoyés.
Certains systèmes d'événements utilisent des références faibles au lieu de références régulières pour résoudre ce problème.
Quelques mots sur les différentes bibliothèques
Systèmes d'événements de type observateur:
- zope.event montre les os nus de comment cela fonctionne (voir la réponse de Lennart ). Remarque: cet exemple ne prend même pas en charge les arguments du gestionnaire.
- « Liste » appelable de LongPoke mise en œuvre de montre qu'un tel système d'événements peut être mis en œuvre très minimalistically par le sous - classement
list
.
- La variation EventHook de Felk garantit également les signatures des appelants et des appelants.
- Le EventHook de spassig (le modèle d'événement de Michael Foord) est une implémentation simple.
- La classe d'événement Valued Lessons de Josip est fondamentalement la même, mais utilise un
set
au lieu d'un list
pour stocker le sac, et met en œuvre __call__
des ajouts raisonnables.
- PyNotify est similaire dans son concept et fournit également des concepts supplémentaires de variables et de conditions («événement changé de variable»). La page d'accueil n'est pas fonctionnelle.
- axel est essentiellement un sac de-gestionnaires avec plus de fonctionnalités liées à filetage, la gestion des erreurs, ...
- python-dispatch nécessite la dérivation des classes sources paires
pydispatch.Dispatcher
.
- buslane est basé sur une classe, prend en charge un ou plusieurs gestionnaires et facilite des conseils de type étendus.
- L' observateur / événement de Pithikos est un modèle léger.
Bibliothèques de publication-abonnement:
- blinker a quelques fonctionnalités astucieuses telles que la déconnexion automatique et le filtrage basé sur l'expéditeur.
- PyPubSub est un package stable, et promet "des fonctionnalités avancées qui facilitent le débogage et la maintenance des rubriques et des messages".
- pymitter est un port Python de Node.js EventEmitter2 et propose des espaces de noms, des caractères génériques et TTL.
- PyDispatcher semble mettre l'accent sur la flexibilité en ce qui concerne la publication plusieurs-à-plusieurs, etc. Prend en charge les références faibles.
- louie est un PyDispatcher retravaillé et devrait fonctionner "dans une grande variété de contextes".
- pypydispatcher est basé sur (vous l'avez deviné ...) PyDispatcher et fonctionne également dans PyPy.
- django.dispatch est un PyDispatcher réécrit "avec une interface plus limitée, mais des performances supérieures".
- pyeventdispatcher est basé sur le répartiteur d'événements du framework Symfony de PHP.
- dispatcher a été extrait de django.dispatch mais devient assez ancien.
- EventManger de Cristian Garcia est une implémentation très courte.
Autres:
- pluggy contient un système de hook utilisé par les
pytest
plugins.
- RxPy3 implémente le modèle observable et permet de fusionner des événements, de réessayer, etc.
- Les signaux et emplacements de Qt sont disponibles sur PyQt
ou PySide2 . Ils fonctionnent comme rappel lorsqu'ils sont utilisés dans le même thread, ou comme événements (à l'aide d'une boucle d'événements) entre deux threads différents. Les signaux et les emplacements ont la limitation de ne fonctionner que dans les objets des classes qui en dérivent
QObject
.