Paket PyPI
Pada Juni 2020, ini adalah paket terkait acara yang tersedia di PyPI, dipesan oleh tanggal rilis terbaru.
Masih ada lagi
Itu banyak perpustakaan untuk dipilih, menggunakan terminologi yang sangat berbeda (peristiwa, sinyal, penangan, pengiriman metode, kait, ...).
Saya mencoba untuk menjaga ikhtisar paket di atas, ditambah teknik yang disebutkan dalam jawaban di sini.
Pertama, beberapa terminologi ...
Pola pengamat
Gaya paling dasar dari sistem acara adalah 'metode kantong penangan', yang merupakan implementasi sederhana dari pola Observer .
Pada dasarnya, metode handler (callable) disimpan dalam array dan masing-masing dipanggil ketika acara 'kebakaran'.
Publikasikan-Berlangganan
Kerugian dari sistem acara Pengamat adalah bahwa Anda hanya dapat mendaftarkan penangan pada objek Acara yang sebenarnya (atau daftar penangan). Jadi pada saat pendaftaran acara sudah perlu ada.
Karena itulah ada gaya kedua sistem acara: pola
terbitkan-berlangganan . Di sini, penangan tidak mendaftar pada objek acara (atau daftar penangan), tetapi pada pengirim pusat. Pemberitahu juga hanya berbicara dengan operator. Apa yang harus didengarkan, atau apa yang akan diterbitkan ditentukan oleh 'sinyal', yang tidak lebih dari sebuah nama (string).
Pola mediator
Mungkin juga menarik: pola Mediator .
Kait
Sistem 'hook' biasanya digunakan dalam konteks plugin aplikasi. Aplikasi berisi titik integrasi tetap (kait), dan setiap plugin dapat terhubung ke kait itu dan melakukan tindakan tertentu.
'Acara' lainnya
Catatan: threading.Event bukan 'sistem acara' dalam arti di atas. Ini adalah sistem sinkronisasi utas di mana satu utas menunggu hingga utas lain 'memberi sinyal' pada objek Peristiwa.
Perpustakaan perpesanan jaringan sering menggunakan istilah 'acara' juga; terkadang konsepnya serupa; terkadang tidak. Mereka tentu saja dapat melintasi batas thread, proses, dan komputer. Lihat misalnya
pyzmq , pymq ,
Twisted , Tornado , gevent , eventlet .
Referensi yang lemah
Dalam Python, memegang referensi ke metode atau objek memastikan bahwa itu tidak akan dihapus oleh pengumpul sampah. Ini dapat diinginkan, tetapi juga dapat menyebabkan kebocoran memori: penangan yang terhubung tidak pernah dibersihkan.
Beberapa sistem acara menggunakan referensi yang lemah alih-alih yang biasa untuk menyelesaikannya.
Beberapa kata tentang berbagai perpustakaan
Sistem acara bergaya pengamat:
- zope.event menunjukkan tulang kosong bagaimana ini bekerja (lihat jawaban Lennart ). Catatan: contoh ini bahkan tidak mendukung argumen penangan.
- Implementasi 'callable list' LongPoke menunjukkan bahwa sistem acara seperti itu dapat diimplementasikan dengan sangat minimalis dengan subklasifikasi
list
.
- Variasi Felk, EventHook juga memastikan tanda tangan callees dan penelepon.
- EventHook spassig (Pola Acara Michael Foord) adalah implementasi langsung.
- Kelas Event Pelajaran Nilai Josip pada dasarnya sama, tetapi menggunakan
set
bukan list
untuk menyimpan tas, dan mengimplementasikan __call__
yang merupakan tambahan yang masuk akal.
- PyNotify serupa dalam konsep dan juga menyediakan konsep-konsep tambahan tentang variabel dan kondisi ('variabel berubah acara'). Beranda tidak berfungsi.
- axel pada dasarnya adalah kantung penanganan dengan lebih banyak fitur yang terkait dengan threading, penanganan kesalahan, ...
- python-dispatch membutuhkan kelas sumber genap untuk diturunkan
pydispatch.Dispatcher
.
- buslane berbasis kelas, mendukung penangan tunggal atau ganda dan memfasilitasi petunjuk jenis yang luas.
- Pengamat / Acara Pithikos adalah desain yang ringan.
Publikasikan-berlangganan perpustakaan:
- blinker memiliki beberapa fitur bagus seperti pemutusan sambungan otomatis dan penyaringan berdasarkan pengirim.
- PyPubSub adalah paket stabil, dan menjanjikan "fitur-fitur canggih yang memfasilitasi debugging dan menjaga topik dan pesan".
- pymitter adalah port Python dari Node.js EventEmitter2 dan menawarkan ruang nama, wildcard, dan TTL.
- PyDispatcher tampaknya menekankan fleksibilitas sehubungan dengan publikasi banyak ke banyak dll. Mendukung referensi yang lemah.
- Louie adalah PyDispatcher yang dikerjakan ulang dan harus bekerja "dalam berbagai konteks".
- pypydispatcher didasarkan pada (Anda dapat menebaknya ...) PyDispatcher dan juga berfungsi di PyPy.
- django.dispatch adalah PyDispatcher yang ditulis ulang "dengan antarmuka yang lebih terbatas, tetapi kinerjanya lebih tinggi".
- pyeventdispatcher didasarkan pada event-dispatcher framework PHP milik Symfony.
- dispatcher diekstraksi dari django.dispatch tetapi semakin tua.
- EventManger Cristian Garcia adalah implementasi yang sangat singkat.
Lainnya:
- Pluggy berisi sistem kait yang digunakan oleh
pytest
plugin.
- RxPy3 mengimplementasikan pola yang Dapat Diamati dan memungkinkan penggabungan acara, coba lagi dll.
- Sinyal dan Slot Qt tersedia dari PyQt
atau PySide2 . Mereka berfungsi sebagai callback ketika digunakan di utas yang sama, atau sebagai peristiwa (menggunakan loop peristiwa) antara dua utas yang berbeda. Sinyal dan Slot memiliki batasan bahwa mereka hanya bekerja pada objek dari kelas yang berasal
QObject
.