क्या केवल GUI प्रोग्रामिंग के लिए घटनाओं का उपयोग किया जाता है?
जब आप सामान्य बैकएंड प्रोग्रामिंग में काम करते हैं, तो इस दूसरी चीज़ के साथ क्या होता है?
क्या केवल GUI प्रोग्रामिंग के लिए घटनाओं का उपयोग किया जाता है?
जब आप सामान्य बैकएंड प्रोग्रामिंग में काम करते हैं, तो इस दूसरी चीज़ के साथ क्या होता है?
जवाबों:
नहीं। वे ऑब्जर्वर को लागू करने और कक्षाओं में संशोधन के लिए बंद हो गए हैं, यह सुनिश्चित करने के लिए वास्तव में काम कर रहे हैं।
मान लीजिए कि हमारे पास एक विधि है जो नए उपयोगकर्ताओं को पंजीकृत करती है।
public void Register(user) {
db.Save(user);
}
फिर कोई यह तय करता है कि एक ईमेल भेजा जाना चाहिए। हम ऐसा कर सकते हैं:
public void Register(user) {
db.Save(user);
emailClient.Send(new RegistrationEmail(user));
}
लेकिन हमने अभी एक वर्ग को संशोधित किया है जिसे संशोधन के लिए बंद किया जाना चाहिए। संभवतः इस सरल छद्म कोड के लिए ठीक है, लेकिन उत्पादन कोड में पागलपन के तरीके की संभावना है। जब तक यह विधि कोड की 30 पंक्तियाँ नहीं है, तब तक नया उपयोगकर्ता बनाने के मूल उद्देश्य से संबंधित है?
यह बहुत अच्छा है कि कक्षा को अपनी मुख्य कार्यक्षमता का प्रदर्शन करने के लिए और एक घटना को उठाने के लिए कहें जो कोई भी सुन रहा है कि एक उपयोगकर्ता पंजीकृत था, और उन्हें जो भी कार्रवाई करने की आवश्यकता है वह ले सकते हैं (जैसे कि एक ईमेल भेजें)।
public void Register(user) {
db.Save(user);
RaiseUserRegisteredEvent(user);
}
इससे हमारा कोड साफ और लचीला रहता है। ओओपी के अक्सर अनदेखे टुकड़ों में से एक यह है कि कक्षाएं एक दूसरे को संदेश भेजती हैं । इवेंट ये संदेश हैं।
नहीं।
गैर-जीयूआई तर्क में उपयोग किए जा रहे घटनाओं का एक क्लासिक उदाहरण डेटाबेस ट्रिगर है।
ट्रिगर कोड है जो किसी दिए गए घटना (INSERT, DELETE, आदि) होने पर निष्पादित होता है। मेरे लिए एक घटना की तरह लगता है।
यह घटना की विकिपीडिया परिभाषा है:
कंप्यूटिंग में, एक घटना सॉफ्टवेयर द्वारा पहचानी जाने वाली क्रिया या घटना है जिसे सॉफ्टवेयर द्वारा नियंत्रित किया जा सकता है। उपयोगकर्ता द्वारा या अन्य तरीकों से कंप्यूटर की घटनाओं को सिस्टम द्वारा उत्पन्न या ट्रिगर किया जा सकता है। आमतौर पर, कार्यक्रमों को प्रोग्राम फ्लो के साथ सिंक्रोनाइज़ किया जाता है, अर्थात, सॉफ़्टवेयर में एक या एक से अधिक समर्पित स्थान हो सकते हैं, जहाँ इवेंट हैंडल किए जाते हैं, अक्सर एक इवेंट लूप। घटनाओं के एक स्रोत में उपयोगकर्ता शामिल हैं, जो सॉफ़्टवेयर के साथ बातचीत कर सकते हैं, उदाहरण के लिए, कीबोर्ड पर कीस्ट्रोक्स। एक अन्य स्रोत एक हार्डवेयर डिवाइस है जैसे टाइमर। सॉफ़्टवेयर ईवेंट लूप में ईवेंट के अपने सेट को ट्रिगर कर सकता है, जैसे किसी कार्य को पूरा करने के लिए संचार करना। घटनाओं के जवाब में अपने व्यवहार को बदलने वाले सॉफ़्टवेयर को इवेंट-चालित कहा जाता है, अक्सर इंटरेक्टिव होने के लक्ष्य के साथ।
सभी ईवेंट उपयोगकर्ता-जनित नहीं हैं। कुछ एक टाइमर द्वारा उत्पन्न किए जाते हैं जैसे डेटाबेस INSERT द्वारा क्रॉस्टैब जैसा कि मैंने पहले उल्लेख किया था।
परिभाषा कुछ कार्यक्रमों या प्रणालियों की तुलना में भी बताती है "इवेंट-चालित, अक्सर संवादात्मक होने के लक्ष्य के साथ" , जिससे व्यक्ति यह पता लगा सकता है कि घटनाओं का उद्देश्य या उपयोगिता पूरी तरह से नहीं है, बल्कि अक्सर अन्तरक्रियाशीलता प्रदान करने के लिए (जैसे GUIs) हालांकि जरूरी नहीं कि GUI, चूंकि CLI प्रोग्राम भी इंटरएक्टिव हों)।
इवेंट-आधारित प्रोग्रामिंग वास्तव में अत्यधिक निष्पादित सर्वर प्रोग्रामिंग के लिए भी उपयोग किया जाता है।
एक सामान्य सर्वर वर्कलोड पर, परिणाम के प्रसंस्करण का अधिकांश समय वास्तव में I / O से आता है। उदाहरण के लिए, (7200 RPM) हार्ड डिस्क ड्राइव से डेटा को खींचने पर 8.3 ms तक का समय लग सकता है। एक आधुनिक GHz प्रोसेसर के लिए, यह ~ 1 मिलियन घड़ी चक्रों के बराबर होगा। यदि CPU हर बार डेटा के लिए प्रतीक्षा करता है (कुछ भी नहीं कर रहा है), तो हम बहुत से घड़ी चक्र खो देंगे।
पारंपरिक प्रोग्रामिंग तकनीक इसके लिए कई सूत्र प्रस्तुत करते हैं । सीपीयू सैकड़ों धागे को समवर्ती रूप से चलाने की कोशिश करता है। हालांकि, यह मॉडल जो समस्या है, वह यह है कि हर बार सीपीयू थ्रेड स्विच करता है, इसके लिए सैंकड़ों क्लॉक साइकिल से लेकर संदर्भ स्विच तक की आवश्यकता होती है । एक संदर्भ स्विच तब होता है जब सीपीयू थ्रेड-लोकल मेमोरी को सीपीयू के रजिस्टरों में कॉपी करता है और पुराने थ्रेड के रजिस्टर / स्टेट को रैम में स्टोर करता है।
इसके अतिरिक्त प्रत्येक थ्रेड को अपने राज्य को संग्रहीत करने के लिए निश्चित मात्रा में मेमोरी का उपयोग करना चाहिए।
आज, सर्वर के लिए एक धक्का दिया गया है जिसमें एक ही धागा है, जो एक लूप में चलता है। फिर काम के टुकड़ों को एक संदेश पंप पर धकेल दिया जाता है , जो एकल धागे के लिए एक कतार के रूप में कार्य करता है (बहुत कुछ यूआई थ्रेड पर)। हार्ड डिस्क ड्राइव एक्सेस जैसी चीजों के लिए सीपीयू काम खत्म होने के इंतजार के बजाय, कॉलबैक इवेंट सेट करता है। जो संदर्भ स्विचिंग को कम करता है।
इस तरह के सर्वर का सबसे अच्छा उदाहरण Node.js है , जिसे मामूली हार्डवेयर के साथ 1 मिलियन समवर्ती कनेक्शन को संभालने में सक्षम दिखाया गया है, जबकि एक जावा / टॉमकैट सर्वर कुछ हजार पर संघर्ष करेगा।
महंगे व्यस्त-प्रतीक्षा छोरों से बचने के लिए नेटवर्क प्रोग्रामिंग (उदाहरण के लिए नगनेक्स) में भी घटनाओं का अत्यधिक उपयोग किया जाता है और इसके बजाय एक निश्चित ऑपरेशन (आई / ओ, तत्काल डेटा आदि) उपलब्ध होने पर ठीक से जानने के लिए एक स्वच्छ इंटरफ़ेस प्रदान करता है । यह C10k समस्या का समाधान भी है ।
मूल विचार ओएस को सॉकेट्स (यानी नेटवर्क कनेक्शन) का सेट प्रदान करना है ताकि घटनाओं की निगरानी की जा सके, उन सभी या बस कुछ विशेष रूप से आप में रुचि रखते हैं (उदाहरण के लिए पढ़ने के लिए उपलब्ध डेटा); जब सूची में किसी एक सॉकेट पर ऑपरेटिंग सिस्टम द्वारा इस तरह की गतिविधि का पता लगाया जाता है, तो आपको उस ईवेंट की सूचना मिल जाएगी, जिसे आप एपीआई द्वारा देख रहे थे, जिसे आपको तब सुलझाना होगा, जहां से वह आता है और उसी के अनुसार कार्य करता है। ।
अब, यह एक निम्न-स्तर और सार दृश्य है, इसके अलावा अच्छी तरह से स्केल करने के लिए मुश्किल है। हालाँकि, उच्च स्तर की चौखटें हैं जो एक समान क्रॉस-प्लेटफ़ॉर्म फैशन से निपटती हैं: पायथन के लिए ट्विस्टेड, C ++ के लिए Boost.Asio या C के लिए libevent मेरे दिमाग में आते हैं।
एंबेडेड सिस्टम लगभग हमेशा स्वाभाविक रूप से घटना-संचालित होते हैं, भले ही वे स्पष्ट रूप से इस तरह से क्रमादेशित न हों।
ये इवेंट हार्डवेयर इंटरप्ट, बटन प्रेस, पीरियड एनालॉग-टू-डिजिटल रीडिंग, टाइमर एक्सपिरिएशन आदि जैसी चीजों से आते हैं।
कम-शक्ति एम्बेडेड सिस्टम इवेंट-चालित होने की अधिक संभावना है; वे अपना अधिकांश समय सोने में बिताते हैं (सीपीयू कम-पावर मोड में सो रहा है), कुछ होने की प्रतीक्षा में (कि "कुछ" एक घटना है)।
ईवेंट-चालित एम्बेडेड सिस्टम के लिए सबसे आम और लोकप्रिय रूपरेखा क्वांटम प्लेटफ़ॉर्म (QP) है (QP लिनक्स, विंडोज और किसी भी यूनिक्स जैसे OS के तहत भी काम करता है।) स्टेट मशीन इवेंट-संचालित प्रोग्रामिंग के लिए एक प्राकृतिक फिट हैं। क्योंकि यह कार्यक्रम विशिष्ट अर्थों में "अनुक्रमिक" नहीं है, बल्कि, यह "कॉलबैक" का एक सेट है जिसे सिस्टम स्थिति और वर्तमान घटना के आधार पर लागू किया जाता है।
ईवेंट संदेश ग्रेगर होपे।
इवेंट ड्रिवेन आर्किटेक्चर्स ग्रेगर होएप।
SEDA वास्तुकला , वेल्श, कुलर, शराब बनानेवाला।
जब आप सामान्य बैकएंड प्रोग्रामिंग में कुछ संभालते हैं तो कुछ ऐसा होता है?
Finite State Machine एक आम तरीका है
Given(State.A)
When(Event.B)
Then(State.C)
.and(Consequences.D)
एम्बेडेड सिस्टम में, इंटरप्ट के दौरान घटनाएं होती हैं। कई अवरोधों के स्रोत हैं, टाइमर से I / O तक।
साथ ही, RTOS में भी इवेंट हो सकते हैं। एक उदाहरण दूसरे कार्य के संदेश की प्रतीक्षा कर रहा है।
गैर एम्बेडेड प्रणाली के लिए लेकिन कुछ मैं C # में कर रहा था SCADA प्रणाली। गोदाम में जो हो रहा था उससे कई घटनाएं जुड़ी हुई थीं जब लोड सिस्टम जनरेटेड इवेंट का अनलोड किया गया था और अन्य हिस्सा डेटाबेस में नया राज्य लिख रहा था। हमारे पास निश्चित रूप से कुछ GUI ग्राहक थे लेकिन यह केवल डेटाबेस की स्थिति को दिखाने के लिए था जो गोदाम की स्थिति को दर्शा रहा था। इसलिए यह घटनाओं और थ्रेडिंग के आधार पर बैकएंड सर्वर सॉफ्टवेयर था। विकसित करने के लिए काफी चुनौतीपूर्ण है।