2017-06-21 8 views
6

में घटनाओं के साथ निगरानी प्रणाली मैं पाइथन में एक प्रोजेक्ट बना रहा हूं और मैं एक निगरानी प्रणाली जोड़ना चाहता हूं जो घटनाओं और ईवेंट हैंडलर का उपयोग करे। मैं इस परियोजना को पूरे परियोजना में उपलब्ध होना चाहता हूं। मेरे पास निम्नलिखित परिचालन दिमाग में हैं:पायथन

  • किसी ईवेंट को परिभाषित करना। घटना कुछ डेटा पैरामीटर के रूप में ले सकती है।
  • मॉनीटर को परिभाषित करना। एक निश्चित घटना के लिए एक मॉनिटर रजिस्टर करता है। एकाधिक मॉनीटर एक ही घटना के लिए पंजीकरण कर सकते हैं। मैं विभिन्न प्रकार के मॉनीटर बनाना चाहता हूं, उदा। डेटा प्रिंट करने के लिए एक, डेटा के साथ भूखंड बनाने के लिए एक, आदि। इस प्रकार एक मॉनीटर एक वर्ग होना चाहिए, जो कुछ डेटा एकत्र करने में सक्षम है, जब तक कि कुछ विधि (जैसे प्रिंट, बनाएं-लॉग, ...) कहा जाता है।
  • मॉनिटर-ईवेंट जोड़ी के लिए इवेंट-हैंडलर को परिभाषित करना। यह परिभाषित करता है कि दिए गए मॉनीटर को दिए गए ईवेंट का जवाब कैसे दिया जाएगा। यह क्रिया अधिकतर होगी: इस डेटा को कुछ मॉनिटर क्लास के उदाहरण की डेटा-सूची में जोड़ें।
  • एक सूचना को सूचित करें जो किसी घटना के दौरान सूचित हो सकता है। यह ईवेंट के हैंडलर को उस घटना के लिए पंजीकृत सभी मॉनीटरों के लिए ट्रिगर करेगा। आदर्श रूप से, अधिसूचना समारोह परियोजना में कहीं से भी कॉल करने योग्य होना चाहिए।

मैं ऐसी प्रणाली कैसे बना सकता हूं? क्या कोई पुस्तकालय है जो इससे मेरी मदद कर सकता है? मैं विशेष रूप से सोच रहा हूं कि मैं इस प्रणाली को इस तरह से कैसे बना सकता हूं कि यह पूरे प्रोजेक्ट में पारदर्शी रूप से उपलब्ध है।

+1

इस लिंक कुछ अपनी जरूरत के लिए इसी है कुछ कर दिया है? https://stackoverflow.com/questions/1092531/event-system-in-python –

+0

@ लुडोविकगुएरा यह निश्चित रूप से सहायक है, उदा। ब्लिंकर अच्छा लग रहा है। लेकिन मैं हैंडलर को कक्षा बनने की तलाश में हूं और एक साधारण कार्य नहीं। इस कक्षा में, मैं सभी डेटा एकत्र करूंगा और फिर एक फ़ंक्शन कॉल करूंगा, उदा। सीएसवी को निर्यात करने या लॉग डेटा की साजिश बनाने के लिए। – JNevens

उत्तर

2

आप क्या तुम अजगर कोड के चालीस लाइनों के साथ चाहते हैं के सबसे कर सकते हैं। यह मेरा खुद का डिज़ाइन है जिसे मैं हर समय उपयोग करता हूं। क्यूटी के "सिग्नल" और "स्लॉट्स" के लिए इसे ड्रॉप-इन प्रतिस्थापन के लिए फ़ंक्शन नाम चुना जाता है।

इसका उपयोग करना आसान है। आप PSignal बनाते हैं। आप connect विधि को कॉल करके हैंडलर पंजीकृत करते हैं। एक हैंडलर कोई कॉल करने योग्य हो सकता है। जब कोई घटना होती है तो आप emit फ़ंक्शन को कॉल करके सिग्नल उत्सर्जित करते हैं (यानी, किसी ईवेंट को सूचित करें)। उस बिंदु पर प्रत्येक पंजीकृत कॉल करने योग्य रन। ऑब्जेक्ट emit को कॉल करने या नहीं, यह पता नहीं है कि कोई सुन रहा है या यदि वे हैं तो क्या होता है।

आप एक हैंडलर को डिस्कनेक्ट भी कर सकते हैं।

बहुत सारे डिबगिंग कोड हैं क्योंकि मुझे पता चला है कि अन्यथा कुछ त्रुटियों को ट्रैक करना मुश्किल हो सकता है।

अपने प्रश्न में आप चाहते हैं कि प्रत्येक हैंडलर मॉनीटर बनें, और मेरे डिज़ाइन हैंडलर केवल फ़ंक्शन हैं। लेकिन मुझे ऐसा लगता है कि आपकी "मॉनीटर" अवधारणा घटना/हैंडलर तंत्र से स्वतंत्र है। आपको अपना आवेदन करने के लिए फ़ंक्शंस लिखना होगा, और उन कार्यों को आपके मॉनीटर को कॉल करना बहुत आसान होना चाहिए।

कोड पायथन 3.3 के साथ बड़े पैमाने पर परीक्षण किया जाता है।

#! python3 
import traceback 

class PSignal: 
    def __init__(self, debug=False): 
     self.debug = debug 
     self.__handlers = [] 

    def clear(self): 
     """Deletes all the handlers.""" 
     self.__handlers.clear() 

    def connect(self, f): 
     """f is a python function.""" 
     if not callable(f): 
      raise ValueError("Object {!r} is not callable".format(f)) 
     self.__handlers.append(f) 
     if self.debug: 
      print("PSIGNAL: Connecting", f, self.__handlers) 

    def disconnect(self, f): 
     for f1 in self.__handlers: 
      if f == f1: 
       self.__handlers.remove(f) 
       return 

    def emit(self, *x, **y): 
     self._emit(*x, **y) 

    def check_debug(self): 
     if self.debug and self.__handlers: 
      print("PSIGNAL: Signal emitted") 
      traceback.print_stack() 

    def _emit(self, *x, **y): 
     self.check_debug() 
     for f in self.__handlers: 
      try: 
       if self.debug: 
        print("PSIGNAL: emit", f, len(x), x, y) 
       f(*x, **y) 
      except Exception: 
       print("PSIGNAL: Error in signal", f) 
       traceback.print_exc() 
0

आप zmq और "प्रकाशक ग्राहक" पैटर्न जैसे विचलित संदेश प्रणाली का उपयोग करके अपना स्वयं का सिस्टम बना सकते हैं।

मैं जैसे कि एक अनुकूलन कार्यप्रवाह इंजन के निर्माण (प्रवाह, https://github.com/mastro35/flows)

अलविदा डी