तो अपने पहले और दूसरे प्रश्न का उत्तर देने के लिए:
गैर-अवरोधक प्रभावी रूप से अतुल्यकालिक के समान है - आप कॉल करते हैं, और आपको बाद में परिणाम मिलेगा, लेकिन जब आप ऐसा कर रहे हैं तो आप कुछ और कर सकते हैं। अवरुद्ध करना विपरीत है। आप अपनी यात्रा जारी रखने से पहले कॉल के लौटने का इंतजार करते हैं।
अब Async / नॉन-ब्लॉकिंग कोड बिल्कुल शानदार लगता है, और यह है। लेकिन मेरे पास चेतावनी के शब्द हैं। विवश वातावरण में काम करते समय Async / Non-block महान होते हैं, जैसे मोबाइल फ़ोन में ... सीमित CPU / मेमोरी पर विचार करें। यह फ्रंट-एंड डेवलपमेंट के लिए भी अच्छा है, जहाँ आपके कोड को किसी तरह से UI विजेट पर प्रतिक्रिया करनी होगी।
Async मौलिक है कि सभी ऑपरेटिंग सिस्टम को काम करने की आवश्यकता है - वे पृष्ठभूमि में आपके लिए काम करते हैं और अपना कोड तब तक जगाते हैं जब उन्होंने आपके लिए क्या किया है, और जब वह कॉल विफल हो जाती है, तो आपको बताया जाता है कि यह नहीं किया गया था अपवाद या किसी प्रकार के रिटर्न कोड / त्रुटि ऑब्जेक्ट द्वारा काम करें।
जब आपका कोड किसी ऐसी चीज़ के लिए कहता है, जिसे प्रतिक्रिया देने में थोड़ा समय लगेगा, तो आपका ओएस जानता है कि वह अन्य सामान करने में व्यस्त हो सकता है। आपका कोड - एक प्रक्रिया, धागा या समकक्ष, ब्लॉक। आपका कोड पूरी तरह से इस बात से बेखबर है कि ओएस में क्या चल रहा है जबकि वह उस नेटवर्क कनेक्शन के बनने का इंतजार करता है, या जबकि वह HTTP रिक्वेस्ट के उस जवाब का इंतजार करता है, या जब वह उस फाइल के पढ़ने / लिखने का इंतजार करता है, और जल्द ही। आप कोड "बस" एक माउस क्लिक के लिए इंतजार कर सकता है। उस समय वास्तव में क्या चल रहा था, जब आपका ओएस मूल रूप से "इवेंट्स" का प्रबंधन, शेड्यूलिंग और प्रतिक्रिया कर रहा था - ओएस की तलाश करने वाली चीजों, जैसे कि मेमोरी, आई / ओ (कीबोर्ड, माउस, डिस्क, इंटरनेट) को प्रबंधित करना। अन्य कार्य, विफलता की वसूली, आदि।
ऑपरेटिंग सिस्टम फ्रिकिन हार्ड-कोर हैं। वे वास्तव में आप प्रोग्रामर से सभी जटिल एसिंक्स / गैर-अवरुद्ध सामान को छिपाने में अच्छे हैं। और यह है कि अधिकांश प्रोग्रामर को कहां मिला है जहां हम आज सॉफ्टवेयर के साथ हैं। अब हम सीपीयू की सीमा को मार रहे हैं, लोग कह रहे हैं कि प्रदर्शन को बेहतर बनाने के लिए चीजों को समानांतर में किया जा सकता है। इसका मतलब यह है कि Async / गैर-अवरोधक ऐसा करने के लिए एक बहुत ही अनुकूल चीज की तरह लगता है, और हाँ, यदि आपका सॉफ़्टवेयर इसकी मांग करता है, तो मैं सहमत हो सकता हूं।
यदि आप एक बैक-एंड वेब सर्वर लिख रहे हैं, तो सावधानी के साथ आगे बढ़ें। याद रखें कि आप बहुत सस्ते के लिए क्षैतिज पैमाने पर कर सकते हैं। नेटफ्लिक्स / अमेज़ॅन / Google / फेसबुक इस नियम के स्पष्ट अपवाद हैं, हालांकि, विशुद्ध रूप से क्योंकि यह कम हार्डवेयर का उपयोग करने के लिए उनके लिए सस्ता काम करता है।
मैं आपको बताता हूँ कि क्यों async / गैर-अवरुद्ध कोड बैक-एंड सिस्टम के साथ एक बुरा सपना है ...।
1) यह उत्पादकता पर सेवा से वंचित हो जाता है ... आपको बहुत अधिक सोचना पड़ता है, और आप रास्ते में बहुत सारी गलतियाँ करते हैं।
2) प्रतिक्रियात्मक कोड में ढेर निशान अनिर्दिष्ट हो जाता है - यह जानना मुश्किल है कि क्या कहा जाता है, कब, क्यों और कैसे। डिबगिंग के साथ गुड लक।
3) आपको इस बारे में अधिक सोचना है कि चीजें कैसे विफल होती हैं, खासकर जब कई चीजें वापस आ जाती हैं कि आपने उन्हें कैसे भेजा। पुरानी दुनिया में, आपने एक समय में एक काम किया था।
4) परीक्षण करना कठिन है।
5) इसे बनाए रखना कठिन है।
6) यह दर्दनाक है। प्रोग्रामिंग एक खुशी और मजेदार होना चाहिए। केवल मर्दवादी दर्द पसंद करते हैं। समवर्ती / प्रतिक्रियात्मक चौखटे लिखने वाले लोग सैडिस्ट होते हैं।
और हाँ, मैंने सिंक और एसिंक्स दोनों लिखा है। मैं तुल्यकालिक पसंद करता हूं क्योंकि 99.99 बैक-एंड एप्लिकेशन इस प्रतिमान के साथ मिल सकते हैं। फ्रंट-एंड ऐप्स को प्रश्न के बिना प्रतिक्रियाशील कोड की आवश्यकता होती है, और यह हमेशा तरीका रहा है।
हां, कोड अतुल्यकालिक, गैर-अवरुद्ध और घटना-आधारित हो सकता है।
प्रोग्रामिंग में सबसे महत्वपूर्ण बात यह सुनिश्चित करना है कि आपका कोड स्वीकार्य समय में काम करता है और प्रतिक्रिया करता है। उस प्रमुख सिद्धांत पर टिके रहें और आप गलत नहीं हो सकते।