क्या अंतर है: अतुल्यकालिक, गैर-अवरुद्ध, घटना-आधार आर्किटेक्चर?


84
  1. के बीच क्या अंतर है:

    • अतुल्यकालिक ,
    • गैर-अवरोधक , और
    • घटना-आधार आर्किटेक्चर?
  2. क्या कुछ अतुल्यकालिक और गैर-अवरोधक (और घटना-आधारित ) हो सकता है?

  3. प्रोग्रामिंग में सबसे महत्वपूर्ण है, कुछ होना: अतुल्यकालिक, गैर-अवरुद्ध और / या घटना-आधार (या सभी 3)?

यदि आप उदाहरण प्रदान कर सकते हैं, तो यह बहुत अच्छा होगा।

यह सवाल इसलिए पूछा जा रहा है क्योंकि मैं इसी तरह के विषय पर इस महान StackOverflow लेख को पढ़ रहा था, लेकिन यह ऊपर मेरे सवालों का जवाब नहीं देता है।

जवाबों:


91

एसिंक्रोनस एसिंक्रोनस का शाब्दिक अर्थ है सिंक्रोनस नहीं। ईमेल अतुल्यकालिक है। आप एक मेल भेजते हैं, आपको अब प्रतिक्रिया मिलने की उम्मीद नहीं है। लेकिन यह गैर-अवरुद्ध नहीं है। अनिवार्य रूप से इसका क्या अर्थ है एक वास्तुकला जहां "घटक" तुरंत प्रतिक्रिया की उम्मीद किए बिना एक दूसरे को संदेश भेजते हैं। HTTP अनुरोध समकालिक हैं। एक अनुरोध भेजें और एक प्रतिक्रिया प्राप्त करें।

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

घटना-आधार यह शब्द परिवाद से आया है। अपने आप में नॉन-ब्लॉकिंग रीड / राइट कॉल बेकार हैं क्योंकि वे आपको "नहीं" बताते हैं जब आपको उन्हें वापस (रिट्री) करना चाहिए। OS से पता लगाने के लिए select / epoll / IOCompletionPort आदि अलग-अलग तंत्र हैं, जब "इन कॉल्स" "दिलचस्प" डेटा को वापस करने की उम्मीद की जाती है। libevent और अन्य ऐसी लाइब्रेरी विभिन्न OSes द्वारा प्रदान की गई इन ईवेंट मॉनिटरिंग सुविधाओं पर रैपर प्रदान करती हैं और काम करने के लिए एक संगत API देती हैं जिसके साथ ऑपरेटिंग सिस्टम चलता है। गैर-अवरुद्ध IO इवेंट-बेस के साथ हाथ से जाता है।

मुझे लगता है कि ये शब्द ओवरलैप हैं। उदाहरण के लिए HTTP प्रोटोकॉल सिंक्रोनस है लेकिन गैर-अवरोधक IO का उपयोग करके HTTP कार्यान्वयन एसिंक्रोनस हो सकता है। फिर से पढ़ने / लिखने / try_lock की तरह एक गैर-अवरुद्ध एपीआई कॉल तुल्यकालिक है (यह तुरंत एक प्रतिक्रिया देता है) लेकिन "डेटा हैंडलिंग" अतुल्यकालिक है।


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

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

4
जब मैं ईमेल भेजता हूं तो मुझे कैसे ब्लॉक किया जाता है लेकिन जवाब की उम्मीद नहीं करता? प्रतिक्रिया का इंतजार करते हुए मैं अपने खुद के व्यवसाय पर ध्यान दे सकता हूं।
कोरे तुगय

20

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

एक सीरियल पोर्ट पर विचार करें, जिसमें से कोड 1,000 बाइट्स प्राप्त करना चाहेगा।

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

एक एसिंक्रोनस-रीड आर्किटेक्चर में, कोड ड्राइवर को बताएगा कि वह 1,000 बाइट्स चाहता है, और 1,000 बाइट्स आने पर अधिसूचित किया जाएगा।

एक गैर-अवरुद्ध वास्तुकला में, कोड किसी भी समय पूछ सकता है कि कितने बाइट्स आए हैं, और किसी भी या सभी ऐसे डेटा को पढ़ सकता है जब वह फिट देखता है, लेकिन एकमात्र तरीका यह पता कर सकता है कि जब सभी डेटा आ चुके हैं, तो पूछना है; यदि कोड एक चौथाई सेकंड के भीतर पता लगाना चाहता है जब 1000 वीं बाइट आ गई है, तो उसे हर तिमाही-दूसरे या तो जांचना होगा।

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


5

तो अपने पहले और दूसरे प्रश्न का उत्तर देने के लिए:

गैर-अवरोधक प्रभावी रूप से अतुल्यकालिक के समान है - आप कॉल करते हैं, और आपको बाद में परिणाम मिलेगा, लेकिन जब आप ऐसा कर रहे हैं तो आप कुछ और कर सकते हैं। अवरुद्ध करना विपरीत है। आप अपनी यात्रा जारी रखने से पहले कॉल के लौटने का इंतजार करते हैं।

अब Async / नॉन-ब्लॉकिंग कोड बिल्कुल शानदार लगता है, और यह है। लेकिन मेरे पास चेतावनी के शब्द हैं। विवश वातावरण में काम करते समय Async / Non-block महान होते हैं, जैसे मोबाइल फ़ोन में ... सीमित CPU / मेमोरी पर विचार करें। यह फ्रंट-एंड डेवलपमेंट के लिए भी अच्छा है, जहाँ आपके कोड को किसी तरह से UI विजेट पर प्रतिक्रिया करनी होगी।

Async मौलिक है कि सभी ऑपरेटिंग सिस्टम को काम करने की आवश्यकता है - वे पृष्ठभूमि में आपके लिए काम करते हैं और अपना कोड तब तक जगाते हैं जब उन्होंने आपके लिए क्या किया है, और जब वह कॉल विफल हो जाती है, तो आपको बताया जाता है कि यह नहीं किया गया था अपवाद या किसी प्रकार के रिटर्न कोड / त्रुटि ऑब्जेक्ट द्वारा काम करें।

जब आपका कोड किसी ऐसी चीज़ के लिए कहता है, जिसे प्रतिक्रिया देने में थोड़ा समय लगेगा, तो आपका ओएस जानता है कि वह अन्य सामान करने में व्यस्त हो सकता है। आपका कोड - एक प्रक्रिया, धागा या समकक्ष, ब्लॉक। आपका कोड पूरी तरह से इस बात से बेखबर है कि ओएस में क्या चल रहा है जबकि वह उस नेटवर्क कनेक्शन के बनने का इंतजार करता है, या जबकि वह HTTP रिक्वेस्ट के उस जवाब का इंतजार करता है, या जब वह उस फाइल के पढ़ने / लिखने का इंतजार करता है, और जल्द ही। आप कोड "बस" एक माउस क्लिक के लिए इंतजार कर सकता है। उस समय वास्तव में क्या चल रहा था, जब आपका ओएस मूल रूप से "इवेंट्स" का प्रबंधन, शेड्यूलिंग और प्रतिक्रिया कर रहा था - ओएस की तलाश करने वाली चीजों, जैसे कि मेमोरी, आई / ओ (कीबोर्ड, माउस, डिस्क, इंटरनेट) को प्रबंधित करना। अन्य कार्य, विफलता की वसूली, आदि।

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

यदि आप एक बैक-एंड वेब सर्वर लिख रहे हैं, तो सावधानी के साथ आगे बढ़ें। याद रखें कि आप बहुत सस्ते के लिए क्षैतिज पैमाने पर कर सकते हैं। नेटफ्लिक्स / अमेज़ॅन / Google / फेसबुक इस नियम के स्पष्ट अपवाद हैं, हालांकि, विशुद्ध रूप से क्योंकि यह कम हार्डवेयर का उपयोग करने के लिए उनके लिए सस्ता काम करता है।

मैं आपको बताता हूँ कि क्यों async / गैर-अवरुद्ध कोड बैक-एंड सिस्टम के साथ एक बुरा सपना है ...।

1) यह उत्पादकता पर सेवा से वंचित हो जाता है ... आपको बहुत अधिक सोचना पड़ता है, और आप रास्ते में बहुत सारी गलतियाँ करते हैं।

2) प्रतिक्रियात्मक कोड में ढेर निशान अनिर्दिष्ट हो जाता है - यह जानना मुश्किल है कि क्या कहा जाता है, कब, क्यों और कैसे। डिबगिंग के साथ गुड लक।

3) आपको इस बारे में अधिक सोचना है कि चीजें कैसे विफल होती हैं, खासकर जब कई चीजें वापस आ जाती हैं कि आपने उन्हें कैसे भेजा। पुरानी दुनिया में, आपने एक समय में एक काम किया था।

4) परीक्षण करना कठिन है।

5) इसे बनाए रखना कठिन है।

6) यह दर्दनाक है। प्रोग्रामिंग एक खुशी और मजेदार होना चाहिए। केवल मर्दवादी दर्द पसंद करते हैं। समवर्ती / प्रतिक्रियात्मक चौखटे लिखने वाले लोग सैडिस्ट होते हैं।

और हाँ, मैंने सिंक और एसिंक्स दोनों लिखा है। मैं तुल्यकालिक पसंद करता हूं क्योंकि 99.99 बैक-एंड एप्लिकेशन इस प्रतिमान के साथ मिल सकते हैं। फ्रंट-एंड ऐप्स को प्रश्न के बिना प्रतिक्रियाशील कोड की आवश्यकता होती है, और यह हमेशा तरीका रहा है।

  1. हां, कोड अतुल्यकालिक, गैर-अवरुद्ध और घटना-आधारित हो सकता है।

  2. प्रोग्रामिंग में सबसे महत्वपूर्ण बात यह सुनिश्चित करना है कि आपका कोड स्वीकार्य समय में काम करता है और प्रतिक्रिया करता है। उस प्रमुख सिद्धांत पर टिके रहें और आप गलत नहीं हो सकते।


** अद्यतन ** गो के साथ खेलने के बाद, और चैनलों और गो-रूटीन के आसपास मेरा सिर पाने के लिए, मुझे कहना होगा कि मैं वास्तव में अपने कोड को अधिक समवर्ती बनाना पसंद करता हूं, क्योंकि भाषा के निर्माणों को सैडिस्ट फ्रेमवर्क लेखकों से सभी दर्द का रास्ता लगता है। हमारे पास async प्रसंस्करण की दुनिया में "सुरक्षित शब्द" है - और यह "गो!"
user924272

4

मेरे लिए, गैर-अवरोधक का अर्थ है कि एक थ्रेड में किसी क्रिया का निष्पादन अन्य थ्रेड्स के निष्पादन पर निर्भर नहीं करता है, यह विशेष रूप से क्रिटिकल सेक्शन की आवश्यकता नहीं है।

एसिंक्रोनस का अर्थ है कि कॉल करने वाले के प्रवाह के बाहर निकालने वाला होता है, और संभावित रूप से विकृत होता है। निष्पादन आमतौर पर किसी अन्य थ्रेड में होता है।

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

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

तीन शब्द संबंधित हैं, लेकिन मेरे लिए अलग अवधारणाएं हैं। यह हो सकता है कि लोग उन्हें कुछ हद तक विनिमेय तरीके से उपयोग करें।


2

आम तौर पर, एक गैर-ब्लॉकिंग आर्किटेक्चर विधि कॉल पर आधारित होता है, जबकि वे कार्यकर्ता थ्रेड पर लंबे समय तक निष्पादित कर सकते हैं , कॉलिंग थ्रेड को ब्लॉक न करें । यदि कॉलिंग थ्रेड के बारे में या उस कार्य को निष्पादित करने की आवश्यकता है, जिसे वर्कर थ्रेड निष्पादित कर रहा है, तो ऐसा करने के लिए कॉलिंग थ्रेड पर निर्भर है।

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

आमतौर पर, एक अतुल्यकालिक वास्तुकला एक घटना-आधारित, गैर-अवरुद्ध वास्तुकला है।

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

यह समझना महत्वपूर्ण है कि क्या घटनाओं को एक ही थ्रेड पर संभाला जाएगा या नहीं, क्योंकि यह निष्पादन की गैर-अवरुद्ध प्रकृति को प्रभावित करेगा, लेकिन मुझे व्यक्तिगत रूप से किसी भी लाइब्रेरी के बारे में पता नहीं है जो एकल थ्रेड पर एसिंक्रोनस निष्पादन प्रबंधन करते हैं।

मैंने उपरोक्त पैराग्राफ को हटा दिया क्योंकि यह कड़ाई से सही नहीं है जैसा कि कहा गया है। मेरा अभिप्राय यह कहना था कि भले ही सिस्टम में संचालन गैर-अवरोधक हो, जैसे कि OS सुविधा को कॉल करना और निष्पादन को जारी रखना, एकल-थ्रेडेड निष्पादन की प्रकृति का मतलब है कि जब घटनाओं को निकाल दिया जाता है, तो उनका मुकाबला किया जाएगा थ्रेड पर समय की गणना के लिए अन्य प्रसंस्करण कार्य।


क्या आपका अंतिम पैराग्राफ आपके कथन का विरोध नहीं कर रहा है कि "अतुल्यकालिक वास्तुकला है ... गैर-अवरोधक"
निकल

मुझे लगता है कि मैंने आपके प्रश्न के "परिभाषा" भाग को संबोधित करने का बहुत अच्छा काम नहीं किया है; मैं एक अद्यतन पोस्ट करूँगा। लेकिन नहीं, एकल-थ्रेडेड निष्पादन की प्रकृति यह है कि हर ऑपरेशन स्वाभाविक रूप से अवरुद्ध है जबकि यह चल रहा है , जो अतुल्यकालिक को अधिक उपयोगी बनाता है।
एरोटोबेयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.