PyPI पैकेज
जून 2020 तक, ये घटना-संबंधित पैकेज PyPI पर उपलब्ध हैं, जो कि हालिया रिलीज़ डेट द्वारा आदेशित किया गया है।
अभी और है
बहुत अधिक शब्दावली (घटनाओं, संकेतों, संचालकों, विधि प्रेषण, हुक, ...) का उपयोग करके बहुत से पुस्तकालयों का चयन करना है।
मैं उपरोक्त पैकेजों का अवलोकन रखने की कोशिश कर रहा हूं, साथ ही साथ उत्तर में वर्णित तकनीकों को भी।
सबसे पहले, कुछ शब्दावली ...
ऑब्जर्वर पैटर्न
ईवेंट सिस्टम की सबसे बुनियादी शैली 'हैंडलर विधियों का बैग' है, जो ऑब्जर्वर पैटर्न का एक सरल कार्यान्वयन है ।
मूल रूप से, हैंडलर तरीके (कॉलबेल) एक सरणी में संग्रहीत किए जाते हैं और प्रत्येक को घटना 'फायर' होने पर कहा जाता है।
प्रकाशित-सदस्यता लें
ऑब्जर्वर इवेंट सिस्टम का नुकसान यह है कि आप केवल वास्तविक इवेंट ऑब्जेक्ट (या हैंडलर सूची) पर हैंडलर पंजीकृत कर सकते हैं। तो पंजीकरण के समय घटना पहले से ही मौजूद है।
यही कारण है कि इवेंट सिस्टम की दूसरी शैली मौजूद है:
प्रकाशन-सदस्यता पैटर्न । यहाँ, हैंडलर किसी ईवेंट ऑब्जेक्ट (या हैंडलर सूची) पर पंजीकरण नहीं करते हैं, लेकिन एक केंद्रीय डिस्पैचर पर। इसके अलावा नोटिफ़ायर केवल डिस्पैचर से बात करते हैं। क्या सुनना है, या क्या प्रकाशित करना है यह 'सिग्नल' द्वारा निर्धारित किया जाता है, जो कि नाम (स्ट्रिंग) से ज्यादा कुछ नहीं है।
मध्यस्थ पैटर्न
रुचि भी हो सकती है: मध्यस्थ पैटर्न ।
हुक्स
एक 'हुक' प्रणाली का उपयोग एप्लिकेशन प्लगइन्स के संदर्भ में किया जाता है। एप्लिकेशन में निश्चित एकीकरण बिंदु (हुक) होते हैं, और प्रत्येक प्लगइन उस हुक से जुड़ सकता है और कुछ क्रियाएं कर सकता है।
अन्य 'घटनाएँ'
नोट: threading.Event उपरोक्त अर्थ में एक 'ईवेंट सिस्टम' नहीं है। यह एक थ्रेड सिंक्रोनाइज़ेशन सिस्टम है जहाँ एक थ्रेड तब तक प्रतीक्षा करता है जब तक कि कोई अन्य थ्रेड इवेंट ऑब्जेक्ट को 'सिग्नल' नहीं देता।
नेटवर्क मैसेजिंग लाइब्रेरी अक्सर 'घटनाओं' शब्द का भी उपयोग करते हैं; कभी-कभी ये अवधारणा में समान होते हैं; कभी-कभी नहीं। वे बेशक धागा-, प्रक्रिया- और कंप्यूटर की सीमाओं को पार कर सकते हैं। जैसे देखें
pyzmq , pymq ,
मुड़ , तूफान , gevent , eventlet ।
कमजोर संदर्भ
पायथन में, किसी विधि या वस्तु के संदर्भ को रखने से यह सुनिश्चित होता है कि यह कचरा संग्राहक द्वारा हटाया नहीं जाएगा। यह वांछनीय हो सकता है, लेकिन यह मेमोरी लीक को भी जन्म दे सकता है: लिंक किए गए हैंडलर को कभी भी साफ नहीं किया जाता है।
कुछ ईवेंट सिस्टम इसे सुलझाने के लिए नियमित के बजाय कमजोर संदर्भों का उपयोग करते हैं।
विभिन्न पुस्तकालयों के बारे में कुछ शब्द
प्रेक्षक शैली की घटना प्रणाली:
- zope.event नंगे हड्डियों को दिखाता है कि यह कैसे काम करता है ( Lennart का जवाब देखें )। नोट: यह उदाहरण हैंडलर के तर्कों का भी समर्थन नहीं करता है।
- लॉन्गपोक की P कॉल करने योग्य सूची ’ कार्यान्वयन से पता चलता है कि इस तरह की घटना प्रणाली को बहुत कम करके उप-वर्ग द्वारा लागू किया जा सकता है
list
।
- फेलक की भिन्नता EventHook भी callees और callers के हस्ताक्षर सुनिश्चित करता है।
- स्पैसिग का इवेंटहुक (माइकल फॉर्ड्स इवेंट पैटर्न) एक सीधा कार्यान्वयन है।
- जोसिप के वैल्यूड लेसनस इवेंट क्लास मूल रूप से एक ही है, लेकिन बैग को स्टोर करने के लिए
set
इसके बजाय का उपयोग करता है list
, और लागू होता है __call__
जो दोनों उचित जोड़ हैं।
- PyNotify अवधारणा में समान है और यह चर और स्थितियों ('परिवर्तनशील परिवर्तन') की अतिरिक्त अवधारणा भी प्रदान करता है। मुखपृष्ठ क्रियाशील नहीं है।
- एक्सल मूल रूप से एक बैग-ऑफ-हैंडलर है जिसमें थ्रेडिंग, एरर हैंडलिंग, ...
- अजगर-प्रेषण के लिए भी स्रोत वर्गों की आवश्यकता होती है
pydispatch.Dispatcher
।
- Buslane वर्ग-आधारित है, एकल या एकाधिक हैंडलर का समर्थन करता है और व्यापक प्रकार के संकेत की सुविधा देता है।
- Pithikos ' ऑब्जर्वर / इवेंट एक हल्का डिज़ाइन है।
प्रकाशित-सदस्यता पुस्तकालय:
- ब्लिंकर में कुछ निफ्टी फीचर्स होते हैं जैसे ऑटोमैटिक डिसकनेक्शन और सेंडर पर आधारित फ़िल्टरिंग।
- PyPubSub एक स्थिर पैकेज है, और "उन्नत सुविधाओं का वादा करता है जो डिबगिंग और विषयों और संदेशों को बनाए रखने की सुविधा प्रदान करता है"।
- pymitter Node.js EventEmitter2 का पायथन पोर्ट है और नामस्थान, वाइल्डकार्ड और TTL प्रदान करता है।
- PyDispatcher कई-कई प्रकाशनों के संबंध में लचीलेपन पर जोर देने लगता है आदि कमजोर संदर्भों का समर्थन करता है।
- लुई एक पर फिर से काम PyDispatcher है और "संदर्भों की एक विस्तृत विविधता में" काम करना चाहिए।
- pypydispatcher पर आधारित है (आप यह अनुमान लगाया ...) PyDispatcher और PyPy में भी काम करता है।
- django.dispatch एक पुनर्लेखन लिखित PyDispatcher है "अधिक सीमित इंटरफ़ेस के साथ, लेकिन उच्च प्रदर्शन"।
- pyeventdispatcher PHP के सिम्फनी फ्रेमवर्क के इवेंट-डिस्पैचर पर आधारित है।
- डिस्पैचर django.dispatch से निकाला गया था, लेकिन काफी पुराना हो रहा है।
- क्रिस्टियन गार्सिया का EventManger वास्तव में एक छोटा कार्यान्वयन है।
अन्य:
- Pluggy में एक हुक सिस्टम होता है जो
pytest
प्लगइन्स द्वारा उपयोग किया जाता है।
- RxPy3 ऑब्जर्वेबल पैटर्न को लागू करता है और विलय की घटनाओं, रिट्री आदि की अनुमति देता है।
- क्यूटी के सिग्नल और स्लॉट PyQt
या PySide2 से उपलब्ध हैं । वे एक ही धागे में, या दो अलग-अलग धागों के बीच (इवेंट लूप का उपयोग करके) कॉलबैक के रूप में काम करते हैं। सिग्नल और स्लॉट की सीमा होती है कि वे केवल उन कक्षाओं की वस्तुओं में काम करते हैं जो इससे प्राप्त होते हैं
QObject
।