Pacchetti PyPI
A partire da giugno 2020, questi sono i pacchetti relativi agli eventi disponibili su PyPI, ordinati per data di rilascio più recente.
C'è più
Ci sono molte librerie tra cui scegliere, usando una terminologia molto diversa (eventi, segnali, gestori, invio di metodi, hook, ...).
Sto cercando di tenere una panoramica dei pacchetti sopra, oltre alle tecniche menzionate nelle risposte qui.
Innanzitutto, un po 'di terminologia ...
Modello di osservatore
Lo stile di base del sistema di eventi è la "borsa dei metodi di gestione", che è una semplice implementazione del modello Observer .
Fondamentalmente, i metodi del gestore (callable) sono memorizzati in un array e vengono chiamati ciascuno quando l'evento "si attiva".
Publish-Subscribe
Lo svantaggio dei sistemi di eventi Observer è che è possibile registrare solo i gestori sull'oggetto Event (o sull'elenco dei gestori) effettivo. Quindi al momento della registrazione l'evento deve già esistere.
Ecco perché esiste il secondo stile di sistemi di eventi: il
modello di pubblicazione-sottoscrizione . Qui, i gestori non si registrano su un oggetto evento (o elenco di gestori), ma su un dispatcher centrale. Anche i notificanti parlano solo al dispatcher. Cosa ascoltare o cosa pubblicare è determinato da 'signal', che non è altro che un nome (stringa).
Modello mediatore
Potrebbe anche essere interessante: il modello del mediatore .
ganci
Un sistema "hook" viene generalmente utilizzato nel contesto dei plug-in dell'applicazione. L'applicazione contiene punti di integrazione fissi (hook) e ciascun plug-in può connettersi a tale hook ed eseguire determinate azioni.
Altri "eventi"
Nota: threading.Event non è un "sistema di eventi" nel senso precedente. È un sistema di sincronizzazione dei thread in cui un thread attende fino a quando un altro thread "segnala" l'oggetto Event.
Le librerie di messaggistica di rete usano spesso anche il termine "eventi"; a volte questi sono simili nel concetto; a volte no. Ovviamente possono attraversare i confini di thread, processi e computer. Vedi ad esempio
pyzmq , pymq ,
Twisted , Tornado , gevent , eventlet .
Riferimenti deboli
In Python, tenere un riferimento a un metodo o oggetto garantisce che non venga eliminato dal Garbage Collector. Questo può essere desiderabile, ma può anche portare a perdite di memoria: i gestori collegati non vengono mai ripuliti.
Alcuni sistemi di eventi utilizzano riferimenti deboli anziché normali per risolvere questo problema.
Alcune parole sulle varie biblioteche
Sistemi di eventi in stile osservatore:
- zope.event mostra le ossa nude di come funziona (vedi la risposta di Lennart ). Nota: questo esempio non supporta nemmeno gli argomenti del gestore.
- L'implementazione dell '"elenco richiamabile" di LongPoke mostra che un tale sistema di eventi può essere implementato in modo molto minimalista tramite la sottoclasse
list
.
- La variazione di Felk EventHook assicura anche le firme di calle e chiamanti.
- EventHook di Spassig (Event Pattern di Michael Foord) è un'implementazione semplice.
- La classe Event di Lezioni valutate di Josip è sostanzialmente la stessa, ma usa un al
set
posto di a list
per conservare la borsa e strumenti __call__
che sono entrambi aggiunte ragionevoli.
- PyNotify è simile nel concetto e fornisce anche concetti aggiuntivi di variabili e condizioni ('evento variabile modificata'). La home page non è funzionale.
- axel è fondamentalmente un bag-of-handlers con più funzioni relative a threading, gestione degli errori, ...
- python-dispatch richiede che le classi di origine pari derivino
pydispatch.Dispatcher
.
- buslane è basato su classi, supporta gestori singoli o multipli e facilita suggerimenti di tipo estesi.
- L' osservatore / evento di Pithikos è un design leggero.
Pubblica / iscrivi le librerie:
- il lampeggiante ha alcune funzioni eleganti come la disconnessione automatica e il filtro basati sul mittente.
- PyPubSub è un pacchetto stabile e promette "funzionalità avanzate che facilitano il debug e il mantenimento di argomenti e messaggi".
- pymitter è una porta Python di Node.js EventEmitter2 e offre spazi dei nomi, caratteri jolly e TTL.
- PyDispatcher sembra enfatizzare la flessibilità per quanto riguarda la pubblicazione da molti a molti, ecc. Supporta riferimenti deboli.
- louie è un PyDispatcher rielaborato e dovrebbe funzionare "in un'ampia varietà di contesti".
- pypydispatcher è basato su (hai indovinato ...) PyDispatcher e funziona anche in PyPy.
- django.dispatch è un PyDispatcher riscritto "con un'interfaccia più limitata, ma prestazioni più elevate".
- pyeventdispatcher è basato sul dispatcher di eventi del framework Symfony di PHP.
- dispatcher è stato estratto da django.dispatch ma sta diventando piuttosto vecchio.
- EventManger di Cristian Garcia è un'implementazione davvero breve.
Altri:
- pluggy contiene un sistema di hook che viene utilizzato dai
pytest
plugin.
- RxPy3 implementa il modello osservabile e consente di unire eventi, riprovare ecc.
- I segnali e gli slot di Qt sono disponibili da PyQt
o PySide2 . Funzionano come callback quando vengono utilizzati nello stesso thread o come eventi (utilizzando un loop di eventi) tra due thread diversi. Segnali e slot hanno la limitazione che funzionano solo in oggetti di classi da cui derivano
QObject
.