क्या केवल GUI प्रोग्रामिंग के लिए घटनाओं का उपयोग किया जाता है?


57

क्या केवल GUI प्रोग्रामिंग के लिए घटनाओं का उपयोग किया जाता है?

जब आप सामान्य बैकएंड प्रोग्रामिंग में काम करते हैं, तो इस दूसरी चीज़ के साथ क्या होता है?


6
वैसे, Event-Event इवेंट-प्रोग्रामिंग के लिए एक पूरी तरह से ऑर्थोगोनल अवधारणा है। इवेंट सोर्सिंग की मूल अवधारणा यह है कि आप अपने सिस्टम के "स्टेट" को स्टोर करने के बजाय "इवेंट्स" या "सिस्टम" में बदलाव करते हैं। उदाहरण के लिए, आप अपने बैंक खाते को a) योर बैलेंस (STATE) या b) लेन-देन की श्रृंखला (EVENTSOURCE) के रूप में मॉडल कर सकते हैं।
6

4
उपयोग के आधार पर, एक "घटना" आमतौर पर चीनी के साथ लिपटे कॉलबैक के कुछ रूप है। कॉलबैक का उपयोग हर जगह किया जाता है - यदि आप रुचि रखते हैं, तो शायद यह एक अच्छा कीवर्ड है जिसके साथ खोज शुरू करनी है।
जे ...

10
मैं यह भी बताऊंगा कि यदि आप माइक्रोकंट्रोलर के रूप में निम्न स्तर पर जाते हैं, तो भी आप पाएंगे कि हार्डवेयर एक उपयोगी और विवादास्पद रूप से आवश्यक विशेषता को बाधित करता है। नियंत्रण प्रणाली के लिए महान, या कॉफी निर्माता की तरह बुनियादी आईओ। ये हार्डवेयर व्यवधान वास्तव में घटनाओं से अनिवार्य रूप से भिन्न नहीं हैं।
दान

नहीं! व्यावहारिक उदाहरण:
नोड्स की

2
क्या आप विंडोज पर हैं? ईवेंट व्यूअर देखें। मज़े करो।
मार्क.2377

जवाबों:


106

नहीं। वे ऑब्जर्वर को लागू करने और कक्षाओं में संशोधन के लिए बंद हो गए हैं, यह सुनिश्चित करने के लिए वास्तव में काम कर रहे हैं।

मान लीजिए कि हमारे पास एक विधि है जो नए उपयोगकर्ताओं को पंजीकृत करती है।

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);
}

इससे हमारा कोड साफ और लचीला रहता है। ओओपी के अक्सर अनदेखे टुकड़ों में से एक यह है कि कक्षाएं एक दूसरे को संदेश भेजती हैं । इवेंट ये संदेश हैं।


37
मैं इसे पढ़ता हूं और हमारी "बुकिंग बनाएं" कोड के बारे में सोचता हूं और एक बेहतर स्थान के लिए थोड़ी देर और लंबे समय तक रोता हूं: '(
सारा

1
+1, बढ़िया जवाब। बस एक स्पर्धात्मक प्रश्न (यह मुझे थोड़ा परेशान करता है): क्या आपके लिए बड़े अक्षरों के साथ अपना विधि नाम (रजिस्टर, सेव और सेंड) शुरू करने का कोई विशेष कारण है? बेशक यह इस जवाब की उपयोगिता को प्रभावित नहीं करता है, हालांकि।
पेड्रो ए

14
@ जीमफिक मैं ज्यादातर सी # देव हूं और यह आम तौर पर स्वीकार किया जाने वाला सम्मेलन है। कोई और कारण नहीं।
रबरडक

6
@ जीमीफिकस एक अतिरिक्त है, जिसे आप लोकेस कहते हैं, लेकिन बीच में एक अपरकेस होता है, जिसे अक्सर कैमलकेस कहा जाता है, क्योंकि इसे बीच में कूबड़ मिला है। जो इसे स्नेक_केस से अलग करता है, जहां लोअरकेस शब्दों को अंडरस्कोर द्वारा अलग किया जाता है, जो कि कुछ नाम रखने के लिए अजगर और अधिकांश शेल भाषाओं से परिचित है।
हारून

5
घटनाएँ इन संदेशों में से एक प्रकार हैं , मैं कहूँगा। मेथड कॉलिंग को मैसेज पासिंग माना जाता है, साथ ही।
jpmc26

53

नहीं।

गैर-जीयूआई तर्क में उपयोग किए जा रहे घटनाओं का एक क्लासिक उदाहरण डेटाबेस ट्रिगर है।

ट्रिगर कोड है जो किसी दिए गए घटना (INSERT, DELETE, आदि) होने पर निष्पादित होता है। मेरे लिए एक घटना की तरह लगता है।

यह घटना की विकिपीडिया परिभाषा है:

कंप्यूटिंग में, एक घटना सॉफ्टवेयर द्वारा पहचानी जाने वाली क्रिया या घटना है जिसे सॉफ्टवेयर द्वारा नियंत्रित किया जा सकता है। उपयोगकर्ता द्वारा या अन्य तरीकों से कंप्यूटर की घटनाओं को सिस्टम द्वारा उत्पन्न या ट्रिगर किया जा सकता है। आमतौर पर, कार्यक्रमों को प्रोग्राम फ्लो के साथ सिंक्रोनाइज़ किया जाता है, अर्थात, सॉफ़्टवेयर में एक या एक से अधिक समर्पित स्थान हो सकते हैं, जहाँ इवेंट हैंडल किए जाते हैं, अक्सर एक इवेंट लूप। घटनाओं के एक स्रोत में उपयोगकर्ता शामिल हैं, जो सॉफ़्टवेयर के साथ बातचीत कर सकते हैं, उदाहरण के लिए, कीबोर्ड पर कीस्ट्रोक्स। एक अन्य स्रोत एक हार्डवेयर डिवाइस है जैसे टाइमर। सॉफ़्टवेयर ईवेंट लूप में ईवेंट के अपने सेट को ट्रिगर कर सकता है, जैसे किसी कार्य को पूरा करने के लिए संचार करना। घटनाओं के जवाब में अपने व्यवहार को बदलने वाले सॉफ़्टवेयर को इवेंट-चालित कहा जाता है, अक्सर इंटरेक्टिव होने के लक्ष्य के साथ।

सभी ईवेंट उपयोगकर्ता-जनित नहीं हैं। कुछ एक टाइमर द्वारा उत्पन्न किए जाते हैं जैसे डेटाबेस INSERT द्वारा क्रॉस्टैब जैसा कि मैंने पहले उल्लेख किया था।

परिभाषा कुछ कार्यक्रमों या प्रणालियों की तुलना में भी बताती है "इवेंट-चालित, अक्सर संवादात्मक होने के लक्ष्य के साथ" , जिससे व्यक्ति यह पता लगा सकता है कि घटनाओं का उद्देश्य या उपयोगिता पूरी तरह से नहीं है, बल्कि अक्सर अन्तरक्रियाशीलता प्रदान करने के लिए (जैसे GUIs) हालांकि जरूरी नहीं कि GUI, चूंकि CLI प्रोग्राम भी इंटरएक्टिव हों)।


2
जब मैं डेटाबेस ट्रिगर के बारे में सुनता हूं, तो मैं हमेशा यही सोचता हूं: thecodelesscode.com/case/42
Almo

एक पूर्व डीबीए अब डेवलपर के रूप में, हर बार जब मैं लोगों को व्यापक DB प्रदर्शन पर विचार किए बिना ट्रिगर्स का उपयोग करने के बारे में बात करते सुनता हूं।
तीन मान तर्क

28

इवेंट-आधारित प्रोग्रामिंग वास्तव में अत्यधिक निष्पादित सर्वर प्रोग्रामिंग के लिए भी उपयोग किया जाता है।

एक सामान्य सर्वर वर्कलोड पर, परिणाम के प्रसंस्करण का अधिकांश समय वास्तव में I / O से आता है। उदाहरण के लिए, (7200 RPM) हार्ड डिस्क ड्राइव से डेटा को खींचने पर 8.3 ms तक का समय लग सकता है। एक आधुनिक GHz प्रोसेसर के लिए, यह ~ 1 मिलियन घड़ी चक्रों के बराबर होगा। यदि CPU हर बार डेटा के लिए प्रतीक्षा करता है (कुछ भी नहीं कर रहा है), तो हम बहुत से घड़ी चक्र खो देंगे।

पारंपरिक प्रोग्रामिंग तकनीक इसके लिए कई सूत्र प्रस्तुत करते हैं । सीपीयू सैकड़ों धागे को समवर्ती रूप से चलाने की कोशिश करता है। हालांकि, यह मॉडल जो समस्या है, वह यह है कि हर बार सीपीयू थ्रेड स्विच करता है, इसके लिए सैंकड़ों क्लॉक साइकिल से लेकर संदर्भ स्विच तक की आवश्यकता होती है । एक संदर्भ स्विच तब होता है जब सीपीयू थ्रेड-लोकल मेमोरी को सीपीयू के रजिस्टरों में कॉपी करता है और पुराने थ्रेड के रजिस्टर / स्टेट को रैम में स्टोर करता है।

इसके अतिरिक्त प्रत्येक थ्रेड को अपने राज्य को संग्रहीत करने के लिए निश्चित मात्रा में मेमोरी का उपयोग करना चाहिए।

आज, सर्वर के लिए एक धक्का दिया गया है जिसमें एक ही धागा है, जो एक लूप में चलता है। फिर काम के टुकड़ों को एक संदेश पंप पर धकेल दिया जाता है , जो एकल धागे के लिए एक कतार के रूप में कार्य करता है (बहुत कुछ यूआई थ्रेड पर)। हार्ड डिस्क ड्राइव एक्सेस जैसी चीजों के लिए सीपीयू काम खत्म होने के इंतजार के बजाय, कॉलबैक इवेंट सेट करता है। जो संदर्भ स्विचिंग को कम करता है।

इस तरह के सर्वर का सबसे अच्छा उदाहरण Node.js है , जिसे मामूली हार्डवेयर के साथ 1 मिलियन समवर्ती कनेक्शन को संभालने में सक्षम दिखाया गया है, जबकि एक जावा / टॉमकैट सर्वर कुछ हजार पर संघर्ष करेगा।


2
"मामूली हार्डवेयर" थोड़ा भ्रामक है। ओएस जो भी उपयोग करता है, इसके अलावा, आपको नोड के लिए 8 जीबी + की आवश्यकता होगी। और अगर आपके पास इतना मेमोरी है, तो टॉमकैट आसानी से कुछ हजार कनेक्शन संभाल सकता है। दी, एक बड़ा अंतर है, लेकिन यह 1000x नहीं है।
पॉल ड्रेपर

@PaulDraper नहीं यह नहीं हो सकता। और नहीं यह नहीं है। 8000 धागे के लिए आपको केवल 8GB + स्टैक की आवश्यकता है। यही बड़ा अंतर है।
ArTs

3
@PaDDper 8GB के अलावा सर्वर मानकों से बहुत मामूली है। मैंने 128GB RAM वाली मशीनों पर काम किया है और वे पूरी तरह से भरी हुई भी नहीं हैं। आपके पूरे मशीन की तुलना में राम की कीमत अधिक है।
19

यह निर्भर करता है कि आपके स्टैक का आकार क्या है। Oracle / OpenJDK 64-बिट के लिए अधिकांश प्लेटफ़ॉर्म पर 1MB और 32-बिट के लिए 512K में डिफॉल्ट करता है। यदि आप केवल डिफॉल्ट करते हैं, तो आप सही होंगे। लेकिन चूक आप 1M नोड कनेक्शन के लिए कैसे नहीं है;) वैसे भी, 128K बहुत है; आप कम से कम दूर हो सकते हैं। कि 8000 थ्रेड्स के लिए 1GB स्टैक स्पेस होगा।
पॉल ड्रेपर

6
आपको ग़लतफहमी हुई है। डिफ़ॉल्ट स्टैक आकार के साथ भी, आपको केवल 8 GBB वर्चुअल मेमोरी की आवश्यकता है। स्मृति को आवश्यकतानुसार मक्खी पर प्रतिबद्ध किया जाता है। आमतौर पर, आपको केवल एक पेज प्रति स्टैक की आवश्यकता होती है, जब तक कि आप वास्तव में अतिरिक्त मेमोरी का उपयोग नहीं कर रहे हों । और व्यवहार में, ऐसी प्रणाली में अधिकांश थ्रेड्स केवल उन (आमतौर पर) 64-केबी स्टैक होते हैं। वर्चुअल मेमोरी का उपयोग 32-बिट ओएस पर एक बड़ा सौदा है, लेकिन 64-बिट पर ऐसा नहीं है। आप बहुत जल्द अन्य सीमाओं में भाग लेते हैं - जैसे कि टीसीपी पोर्ट थकावट, :) और जहां आपको लगता है कि नोड के "छद्म ढेर" संग्रहीत हैं? यह सही है, ढेर पर।
लुआं

10

महंगे व्यस्त-प्रतीक्षा छोरों से बचने के लिए नेटवर्क प्रोग्रामिंग (उदाहरण के लिए नगनेक्स) में भी घटनाओं का अत्यधिक उपयोग किया जाता है और इसके बजाय एक निश्चित ऑपरेशन (आई / ओ, तत्काल डेटा आदि) उपलब्ध होने पर ठीक से जानने के लिए एक स्वच्छ इंटरफ़ेस प्रदान करता है । यह C10k समस्या का समाधान भी है

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

अब, यह एक निम्न-स्तर और सार दृश्य है, इसके अलावा अच्छी तरह से स्केल करने के लिए मुश्किल है। हालाँकि, उच्च स्तर की चौखटें हैं जो एक समान क्रॉस-प्लेटफ़ॉर्म फैशन से निपटती हैं: पायथन के लिए ट्विस्टेड, C ++ के लिए Boost.Asio या C के लिए libevent मेरे दिमाग में आते हैं।


+1 "महंगी व्यस्त-प्रतीक्षा छोरों": दूसरे शब्दों में, यह किसी भी समानांतर प्रक्रियाओं में उपयोगी है जिसमें कुछ निष्क्रियता (प्रतीक्षा) शामिल है, साथ ही साथ ऐसी प्रक्रियाओं (संदेशों या घटनाओं) के बीच समन्वय भी होता है। जितना वास्तविक दुनिया काम करती है।
fr13d

यह पता लगाना दिलचस्प है कि नेटवर्किंग के अस्तित्व में आने से पहले सॉकेट्स को मूल रूप से एक मशीन पर IPC के रूप में डिज़ाइन किया गया था।

5

एंबेडेड सिस्टम लगभग हमेशा स्वाभाविक रूप से घटना-संचालित होते हैं, भले ही वे स्पष्ट रूप से इस तरह से क्रमादेशित न हों।

ये इवेंट हार्डवेयर इंटरप्ट, बटन प्रेस, पीरियड एनालॉग-टू-डिजिटल रीडिंग, टाइमर एक्सपिरिएशन आदि जैसी चीजों से आते हैं।

कम-शक्ति एम्बेडेड सिस्टम इवेंट-चालित होने की अधिक संभावना है; वे अपना अधिकांश समय सोने में बिताते हैं (सीपीयू कम-पावर मोड में सो रहा है), कुछ होने की प्रतीक्षा में (कि "कुछ" एक घटना है)।

ईवेंट-चालित एम्बेडेड सिस्टम के लिए सबसे आम और लोकप्रिय रूपरेखा क्वांटम प्लेटफ़ॉर्म (QP) है (QP लिनक्स, विंडोज और किसी भी यूनिक्स जैसे OS के तहत भी काम करता है।) स्टेट मशीन इवेंट-संचालित प्रोग्रामिंग के लिए एक प्राकृतिक फिट हैं। क्योंकि यह कार्यक्रम विशिष्ट अर्थों में "अनुक्रमिक" नहीं है, बल्कि, यह "कॉलबैक" का एक सेट है जिसे सिस्टम स्थिति और वर्तमान घटना के आधार पर लागू किया जाता है।


3

ईवेंट संदेश ग्रेगर होपे।

इवेंट ड्रिवेन आर्किटेक्चर्स ग्रेगर होएप।

SEDA वास्तुकला , वेल्श, कुलर, शराब बनानेवाला।

जब आप सामान्य बैकएंड प्रोग्रामिंग में कुछ संभालते हैं तो कुछ ऐसा होता है?

Finite State Machine एक आम तरीका है

Given(State.A)
When(Event.B)
Then(State.C)
    .and(Consequences.D)

2
1, यह वास्तव में सुसंगत उत्तर नहीं है, और 2, FSM घटना के उपयोग के अच्छे उदाहरण नहीं हैं।
whatsisname

1
FSM। मुझे यकीन है कि
अतीत

0

एम्बेडेड सिस्टम में, इंटरप्ट के दौरान घटनाएं होती हैं। कई अवरोधों के स्रोत हैं, टाइमर से I / O तक।

साथ ही, RTOS में भी इवेंट हो सकते हैं। एक उदाहरण दूसरे कार्य के संदेश की प्रतीक्षा कर रहा है।


0

गैर एम्बेडेड प्रणाली के लिए लेकिन कुछ मैं C # में कर रहा था SCADA प्रणाली। गोदाम में जो हो रहा था उससे कई घटनाएं जुड़ी हुई थीं जब लोड सिस्टम जनरेटेड इवेंट का अनलोड किया गया था और अन्य हिस्सा डेटाबेस में नया राज्य लिख रहा था। हमारे पास निश्चित रूप से कुछ GUI ग्राहक थे लेकिन यह केवल डेटाबेस की स्थिति को दिखाने के लिए था जो गोदाम की स्थिति को दर्शा रहा था। इसलिए यह घटनाओं और थ्रेडिंग के आधार पर बैकएंड सर्वर सॉफ्टवेयर था। विकसित करने के लिए काफी चुनौतीपूर्ण है।

https://en.wikipedia.org/wiki/SCADA

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.