PyPI paketleri
Haziran 2020 itibariyle, bunlar en son çıkış tarihlerine göre sıralanan PyPI'de bulunan olayla ilgili paketlerdir.
Fazlası var
Çok farklı bir terminoloji (olaylar, sinyaller, işleyiciler, yöntem dağıtımı, kancalar, ...) kullanarak seçim yapabileceğiniz çok sayıda kütüphane.
Yukarıdaki paketlerin yanı sıra burada cevaplarda belirtilen tekniklerin bir özetini tutmaya çalışıyorum.
İlk olarak, bazı terminoloji ...
Gözlemci modeli
Olay sisteminin en temel tarzı, Gözlemci modelinin basit bir uygulaması olan 'işleyici yöntemleri torbası'dır .
Temel olarak, işleyici yöntemleri (callables) bir dizide saklanır ve olay 'tetiklendiğinde' her biri çağrılır.
Yayınla-Abone
Observer olay sistemlerinin dezavantajı, işleyicileri yalnızca gerçek Event nesnesine (veya işleyiciler listesine) kaydedebilmenizdir. Yani kayıt sırasında etkinliğin zaten mevcut olması gerekir.
Bu nedenle olay sistemlerinin ikinci stili vardır:
yayınla-abone ol düzeni . Burada, işleyiciler bir olay nesnesine (veya işleyici listesine) değil, merkezi bir dağıtım programına kaydolur. Ayrıca bildirimler yalnızca dağıtım görevlisi ile konuşur. Ne dinleyeceğiniz veya ne yayınlayacağınız, bir isimden (dize) başka bir şey olmayan 'sinyal' ile belirlenir.
Aracı deseni
İlgilenebilir: Arabulucu modeli .
Kancalar
Bir 'kanca' sistemi genellikle uygulama eklentileri bağlamında kullanılır. Uygulama sabit entegrasyon noktaları (kancalar) içerir ve her eklenti bu kancaya bağlanabilir ve belirli eylemleri gerçekleştirebilir.
Diğer olaylar'
Not: threading.Event , yukarıdaki anlamda bir 'olay sistemi' değildir. Bir iş parçacığının başka bir iş parçacığı Event nesnesini 'işaretleyene' kadar beklediği iş parçacığı eşitleme sistemidir.
Ağ mesajlaşma kütüphaneleri genellikle 'etkinlikler' terimini de kullanır; bazen bunlar kavramda benzerdir; bazen değil. Elbette iş parçacığı, süreç ve bilgisayar sınırlarını aşabilirler. Bkz. Örneğin
pyzmq , pymq ,
Twisted , Tornado , gevent , eventlet .
Zayıf referanslar
Python'da, bir yönteme veya nesneye başvuruda bulunulması, çöp toplayıcı tarafından silinmemesini sağlar. Bu arzu edilebilir, ancak bellek sızıntılarına da neden olabilir: bağlı işleyiciler asla temizlenmez.
Bazı olay sistemleri bunu çözmek için normal olanlar yerine zayıf referanslar kullanır.
Çeşitli kütüphaneler hakkında bazı kelimeler
Gözlemci tarzı olay sistemleri:
- zope.event bunun nasıl çalıştığına dair çıplak kemikleri gösterir (bkz . Lennart'ın cevabı ). Not: bu örnek işleyici argümanlarını bile desteklemez.
- LongPoke'ın 'çağrılabilir liste' uygulaması, böyle bir olay sisteminin alt sınıflandırma yoluyla çok minimalist olarak uygulanabileceğini göstermektedir
list
.
- Felk'in varyasyonu EventHook ayrıca callees ve arayanların imzalarını da sağlar.
- spassig'in EventHook'u (Michael Foord'un Etkinlik Paterni) basit bir uygulamadır.
- Josip'in Değerli Dersleri Event sınıfı temelde aynıdır, ancak çantayı saklamak için a
set
yerine list
ve __call__
her ikisi de makul eklemeler olan aletler kullanır .
- PyNotify , kavram olarak benzerdir ve ayrıca değişkenler ve koşullar ('değişken değiştirilmiş olay') için ek kavramlar sağlar. Ana sayfa işlevsel değil.
- axel temel olarak diş çekme, hata işleme, ... ile ilgili daha fazla özelliğe sahip bir torba işleyicidir.
- python-dispatch , türetmek için çift kaynak sınıflarını gerektirir
pydispatch.Dispatcher
.
- buslane sınıf tabanlıdır, tek veya çoklu işleyicileri destekler ve kapsamlı tip ipuçlarını kolaylaştırır.
- Pithikos'un Gözlemcisi / Etkinliği hafif bir tasarımdır.
Yayınlama-abone olma kütüphaneleri:
- flaşör , göndericiye dayalı otomatik bağlantı kesme ve filtreleme gibi bazı şık özelliklere sahiptir.
- PyPubSub kararlı bir pakettir ve "konuların ve mesajların hata ayıklamasını ve bakımını kolaylaştıran gelişmiş özellikler" vaat eder.
- pymitter , Node.js EventEmitter2'nin bir Python bağlantı noktasıdır ve ad alanları, joker karakterler ve TTL sunar.
- PyDispatcher, çoktan çoğa yayın vb. İle ilgili esnekliği vurgulamaktadır. Zayıf referansları destekler.
- louie elden geçirilmiş bir PyDispatcher ve "çok çeşitli bağlamlarda" çalışmalıdır.
- pypydispatcher dayanır (tahmin ettiniz ...) PyDispatcher ve aynı zamanda PyPy çalışır.
- django.dispatch "daha sınırlı bir arayüz ancak daha yüksek performansa sahip" yeniden yazılmış bir PyDispatcher.
- pyeventdispatcher , PHP'nin Symfony çerçevesinin olay göndericisini temel alır.
- dağıtıcı django.dispatch dosyasından ayıklandı, ancak oldukça eski oluyor.
- Cristian Garcia'nın EventManger'ı gerçekten kısa bir uygulama.
Diğerleri:
- pluggy ,
pytest
eklentiler tarafından kullanılan bir kanca sistemi içerir .
- RxPy3 , Gözlenebilir patern uygular ve olayların birleştirilmesine, yeniden denenmesine vb. Olanak tanır.
- Qt'nin Sinyalleri ve Yuvaları PyQt
veya PySide2'den edinilebilir . Aynı iş parçacığında kullanıldığında geri arama veya iki farklı iş parçacığı arasında olaylar (bir olay döngüsü kullanarak) olarak çalışırlar. Sinyaller ve Yuvalar, sadece türetilmiş sınıf nesnelerinde çalışma sınırına sahiptir
QObject
.