अतुल्यकालिक बनाम गैर-अवरुद्ध


373

अतुल्यकालिक और गैर-अवरोधक कॉल के बीच अंतर क्या है? अवरुद्ध और तुल्यकालिक कॉल के बीच भी (उदाहरण के लिए कृपया)?



1
पुस्तक पढ़ते समय अंतर के बारे में मुझे अच्छी समझ थी <Unix Networking Programming> Col ​​1, Chapter 6.
Bin

2
एक दिलचस्प लेख: एसिंक्रोनस I / O का उपयोग करके प्रदर्शन को बढ़ावा देना । यह I / O प्रतिमानों को 4 श्रेणियों में वर्गीकृत करता है: (1) ब्लॉकिंग + सिंक्रोनस, (2) नॉन-ब्लॉकिंग + सिंक्रोनस, (3) ब्लॉकिंग + एसिंक्रोनस, और (4) नॉन-ब्लॉकिंग / एसिंक्रोनस।
MS Dousti

@MSDousti मुझे बताया गया था कि यह Google विशेषज्ञ से कुछ मायनों में गलत है।
रिक

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

जवाबों:


304

कई परिस्थितियों में वे एक ही चीज के लिए अलग-अलग नाम हैं, लेकिन कुछ संदर्भों में वे काफी अलग हैं। तो यह निर्भर करता है। शब्दावली पूरे सॉफ्टवेयर उद्योग में पूरी तरह से सुसंगत तरीके से लागू नहीं होती है।

उदाहरण के लिए, क्लासिक सॉकेट्स एपीआई में, एक नॉन-ब्लॉकिंग सॉकेट वह है जो केवल एक विशेष "त्रुटि संदेश" को ब्लॉक करेगा, जबकि एक अवरुद्ध सॉकेट अवरुद्ध हो जाएगा। आप एक अलग समारोह में इस तरह के रूप में उपयोग करने के लिए है selectया pollजब पुन: प्रयास करने के लिए एक अच्छा समय है पता लगाने के लिए।

लेकिन एसिंक्रोनस सॉकेट (जैसा कि विंडोज सॉकेट्स द्वारा समर्थित है), या .NET में उपयोग किए जाने वाले एसिंक्रोनस IO पैटर्न अधिक सुविधाजनक हैं। आप एक ऑपरेशन शुरू करने के लिए एक विधि कहते हैं, और जब यह हो जाता है तो ढांचा आपको वापस बुलाता है। यहां भी, बुनियादी अंतर हैं। एसिंक्रोनस Win32 सॉकेट "मार्शल" उनके परिणाम एक विशिष्ट GUI धागे पर विंडो संदेश पास करके देता है, जबकि .NET अतुल्यकालिक IO मुक्त-थ्रेडेड है (आपको नहीं पता कि आपके कॉलबैक को किस थ्रेड पर बुलाया जाएगा)।

तो वे हमेशा एक ही बात का मतलब नहीं है। सॉकेट उदाहरण को खराब करने के लिए, हम कह सकते हैं:

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

पूर्ण राज्य IO के बजाय तैयार राज्य IO; लिनक्स पर libaio देख
विल

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

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

2
@ChadNB - शर्तों के अनुसार, गैर-अवरोधक मतदान के साथ दृढ़ता से जुड़ा हुआ है। इस सवाल के बारे में कि क्या एपीआई इसे कॉल करने के आपके प्रयास को "याद" करता है: एपीआई को याद रखने का एकमात्र कारण आपको वापस बुलाने के लिए है। यदि आप इसे फिर से मतदान करने के लिए बुला रहे हैं, तो आपको पहले से ही आवश्यक स्थिति बनाए रखनी होगी ताकि बाद में कॉल करने के लिए पता चल सके, इसलिए एपीआई राज्य बनाए रखने से कोई मूल्य नहीं जोड़ेगा।
डैनियल ईयरविकर

6
गैर-अवरुद्ध कॉल कहने के बजाय "त्रुटि" देता है, मुझे लगता है कि यह कहना अधिक सटीक होगा कि एक गैर-अवरोधक कॉल उतना ही करता है जितना आवश्यक रूप से तुरंत किया जा सकता है, और फिर यह इंगित करता है कि उसने कितना किया। कुछ कार्यों के लिए, किए गए कार्य की मात्रा या तो "सब कुछ" या "कुछ भी नहीं" होगी, लेकिन कुछ अन्य संचालन (जैसे स्ट्रीम I / O) एक मात्रात्मक संकेत वापस कर सकते हैं। यदि अवरुद्ध I / O क्रियान्वयन किसी ऑपरेशन को सुचारू रूप से बाद में सुचारू रूप से करने के लिए अनुमति देता है (कुछ करते हैं, तो कुछ अवरुद्ध) बहुत कम समय के साथ अवरुद्ध करने के बराबर है ।
सुपरकाट

56

सिंक्रोनस / एसिंक्रोनस दो मॉड्यूल के बीच संबंध का वर्णन करने के लिए है।
ब्लॉकिंग / नॉन-ब्लॉकिंग एक मॉड्यूल की स्थिति का वर्णन करना है।

एक उदाहरण:
मॉड्यूल एक्स: "आई"।
मॉड्यूल वाई: "बुकस्टोर"।
X पूछता है Y: क्या आपके पास "c ++ प्राइमर" नाम की कोई किताब है?

1) अवरुद्ध करना: Y उत्तर से पहले X, X उत्तर की प्रतीक्षा में रहता है। अब X (एक मॉड्यूल) ब्लॉक हो रहा है। X और Y दो धागे या दो प्रक्रियाएँ या एक धागा या एक प्रक्रिया हैं? हम नहीं जानते।

2) नॉन-ब्लॉकिंग: वाई जवाब से पहले एक्स, एक्स सिर्फ वहां छोड़ देता है और अन्य काम करता है। X हर दो मिनट में जांच कर सकता है कि क्या Y ने अपना काम पूरा कर लिया है? या X तब तक वापस नहीं आएगा जब तक Y उसे फोन नहीं करता? हम नहीं जानते। हम केवल यह जानते हैं कि Y अपना काम पूरा करने से पहले X अन्य काम कर सकता है। यहां X (एक मॉड्यूल) गैर-अवरुद्ध है। X और Y दो धागे या दो प्रक्रियाएँ या एक प्रक्रिया हैं? हम नहीं जानते। लेकिन हमें यकीन है कि X और Y एक धागा नहीं हो सकते।

3) सिंक्रोनस: वाई जवाब से पहले एक्स, एक्स जवाब के लिए वहां इंतजार करता रहता है। इसका मतलब है कि X तब तक जारी नहीं रह सकता जब तक Y अपना काम पूरा नहीं कर लेता। अब हम कहते हैं: X और Y (दो मॉड्यूल) समकालिक हैं। X और Y दो धागे या दो प्रक्रियाएँ या एक धागा या एक प्रक्रिया हैं? हम नहीं जानते।

4) एसिंक्रोनस: वाई जवाब से पहले एक्स, एक्स छोड़ देता है और एक्स अन्य काम कर सकता है। जब तक वाई उसे फोन नहीं करेगा तब तक एक्स वापस नहीं आएगा। अब हम कहते हैं: X और Y (दो मॉड्यूल) एसिंक्रोनस हैं। X और Y दो धागे या दो प्रक्रियाएं या एक प्रक्रिया हैं? हम नहीं जानते। लेकिन हमें यकीन है कि X और Y एक धागा नहीं हो सकते।


कृपया ऊपर दिए गए दो बोल्ड-वाक्यों पर ध्यान दें। 2 में बोल्ड-वाक्य क्यों होता है) दो मामलों में जबकि 4 में बोल्ड-वाक्य में केवल एक मामला होता है? यह गैर-अवरुद्ध और अतुल्यकालिक के बीच अंतर की एक कुंजी है।

यहाँ गैर-अवरोधक और तुल्यकालिक के बारे में एक विशिष्ट उदाहरण दिया गया है:

// thread X
while (true)
{
    msg = recv(Y, NON_BLOCKING_FLAG);
    if (msg is not empty)
    {
        break;
    }
    sleep(2000); // 2 sec
}

// thread Y
// prepare the book for X
send(X, book);

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

चार शब्द हमें आसानी से भ्रमित करते हैं, हमें जो याद रखना चाहिए वह यह है कि चार शब्द वास्तुकला के डिजाइन के लिए काम करते हैं। एक अच्छी वास्तुकला डिजाइन करने के बारे में सीखना, उन्हें अलग करने का एकमात्र तरीका है।

उदाहरण के लिए, हम इस तरह की वास्तुकला को डिजाइन कर सकते हैं:

// Module X = Module X1 + Module X2
// Module X1
while (true)
{
    msg = recv(many_other_modules, NON_BLOCKING_FLAG);
    if (msg is not null)
    {
        if (msg == "done")
        {
            break;
        }
        // create a thread to process msg
    }
    sleep(2000); // 2 sec
}
// Module X2
broadcast("I got the book from Y");


// Module Y
// prepare the book for X
send(X, book);

यहाँ उदाहरण में, हम कह सकते हैं कि

  • X1 गैर-अवरोधक है
  • एक्स 1 और एक्स 2 सिंक्रोनस हैं
  • X और Y अतुल्यकालिक हैं

यदि आपको आवश्यकता है, तो आप चार शब्दों के साथ X1 में बनाए गए उन थ्रेड्स का भी वर्णन कर सकते हैं।

अधिक महत्वपूर्ण चीजें हैं: हम अतुल्यकालिक के बजाय सिंक्रोनस का उपयोग कब करते हैं? हम गैर-अवरोधक के बजाय अवरुद्ध का उपयोग कब करते हैं?

Nginx गैर-अवरुद्ध क्यों है? अपाचे क्यों अवरुद्ध है?

एक अच्छा विकल्प बनाने के लिए, आपको अपनी आवश्यकता का विश्लेषण करना चाहिए और विभिन्न आर्किटेक्चर के प्रदर्शन का परीक्षण करना चाहिए। ऐसी कोई वास्तुकला नहीं है जो विभिन्न आवश्यकताओं के लिए उपयुक्त हो।


7
IMO सबसे अच्छा उत्तर है क्योंकि यह अवधारणा का सार पकड़ता है: एक या दो प्रतिभागियों के बीच का संबंध।
फोबियो

1 और 3 दोनों में, Y एक सीमित संसाधन के रूप में कार्य कर रहा है। X
UVM

46
  • एसिंक्रोनस समानांतर में किए गए कुछ को संदर्भित करता है , कहते हैं कि एक और धागा है।
  • गैर-अवरुद्ध अक्सर मतदान को संदर्भित करता है , अर्थात यह जांचना कि क्या दी गई स्थिति (सॉकेट पठनीय है, डिवाइस में अधिक डेटा है, आदि)

17
जब मैं / O शामिल होता है, तो अतुल्यकालिक आमतौर पर "समानांतर में" नहीं होता है, न ही "एक और धागा", ज्यादातर यह अधिसूचना-आधारित होता है। वह है: ब्लॉक मत करो, मतदान मत करो, बस संकेत मिलता है। बेशक, यह तर्क दिया जा सकता है कि संकेत 'वास्तविक दुनिया' से आ रहा है जिसे 'एक और सूत्र' के रूप में सोचा जा सकता है ...
जेवियर

ठीक है, हाँ, हम पूरे दिन सटीक शब्द बहस कर सकते हैं :)
निकोलाई फेटिसोव

लेकिन आप लिनक्स में AIO की व्याख्या कैसे करते हैं? जिसमें Async और non-block दोनों का उपयोग किया गया था। AIO LINKS
Djvu

16
इस उत्तर को पढ़ने वाले किसी भी व्यक्ति के लिए: यह सटीक शब्दों पर बहस नहीं कर रहा है। उसी तरह से जो संगामिति और समानांतरवाद एक ही धारणा नहीं है और उन्हें अलग करना एक मुद्दा नहीं है। एसिंक्रोनसिटी और समानांतरवाद दो अलग-अलग जानवर हैं और यह जवाब गलत तरीके से उन्हें एक ही बनाता है।
१२:३३ पर Ptival

2
Async जरूरी नहीं है कि यह समानांतर में किया गया है, समवर्ती और समानांतर प्रोग्रामिंग के बारे में stackoverflow पर इस महान पोस्ट देखें ।
BARJ

17

इस प्रश्न को NIO और NIO.2 के संदर्भ में java 7 में डालते हुए, async IO गैर-अवरोधक की तुलना में एक कदम अधिक उन्नत है। जावा एनआईओ नॉन-ब्लॉकिंग कॉल के साथ, कोई भी कॉल करके सभी चैनल (सॉकेटचैनलाइन, सर्वरसॉफ्टचैनल, फाइलचैनल इत्यादि) सेट करेगा AbstractSelectableChannel.configureBlocking(false)। उन आईओ के बाद वापसी कहता है, तथापि, आप की संभावना अभी भी इस तरह अगर और जब आदि फिर से पढ़ने / लिखने के लिए, के रूप में चेकों को नियंत्रित करने की आवश्यकता होगी
उदाहरण के लिए,

while (!isDataEnough()) {
    socketchannel.read(inputBuffer);
    // do something else and then read again
}

जावा 7 में एसिंक्रोनस एपि के साथ, इन नियंत्रणों को और अधिक बहुमुखी तरीकों से बनाया जा सकता है। 2 तरीकों में से एक का उपयोग करना है CompletionHandler। ध्यान दें कि दोनों readकॉल गैर-अवरुद्ध हैं।

asyncsocket.read(inputBuffer, 60, TimeUnit.SECONDS /* 60 secs for timeout */, 
    new CompletionHandler<Integer, Object>() {
        public void completed(Integer result, Object attachment) {...}  
        public void failed(Throwable e, Object attachment) {...}
    }
}

3
FileChannelचयन करने योग्य नहीं है और इसे गैर-अवरुद्ध करने के लिए कॉन्फ़िगर नहीं किया जा सकता है।
माइकेलियु

15

जैसा कि आप शायद विभिन्न (और अक्सर पारस्परिक रूप से अनन्य) की भीड़ से देख सकते हैं, यह इस बात पर निर्भर करता है कि आप किससे पूछते हैं। कुछ अखाड़ों में, शब्द पर्यायवाची हैं। या वे दो समान अवधारणाओं का उल्लेख कर सकते हैं:

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

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

क्षमा करें, लेकिन मुझे विश्वास नहीं है कि एक भी सही उत्तर है जो विश्व स्तर पर सत्य है।


1
+1 अच्छा जवाब। लोग जानते हैं कि "अतुल्यकालिक" मतलब हो सकता है की जरूरत है या तो गैर अवरुद्ध, या माइक्रोसॉफ्ट asynch (घटना आधारित / कॉलबैक) दृष्टिकोण।
इंजीनियर

14

जो भी डेटा उपलब्ध है, उसके साथ एक गैर-कॉलिंग कॉल तुरंत वापस आती है: अनुरोधित बाइट्स की पूरी संख्या, कम, या कोई भी नहीं।

एक एसिंक्रोनस कॉल एक हस्तांतरण का अनुरोध करता है जो अपने पूरे (संपूर्ण) में किया जाएगा लेकिन भविष्य के कुछ समय पर पूरा होगा।


नॉन-ब्लॉकिंग का कोई भी परिणाम कुछ भी नहीं होता है
सीईओ एक्स्टिको

9

गैर-अवरुद्ध: यह फ़ंक्शन स्टैक पर रहते हुए प्रतीक्षा नहीं करेगा।

एसिंक्रोनस: फ़ंक्शन कॉल के बाद भी काम जारी रह सकता है, क्योंकि कॉल स्टैक से निकल गया है


1
@Marenz का अर्थ है कि आप गैर-अवरुद्ध io को सीधे पॉज़िक्स कॉल के साथ नहीं कर सकते। वह यहां दिए गए अर्थ को नहीं बदलता है।
टीएमसी

@Marenz जिसका मतलब केवल यह है कि झंडे को फाइलों के लिए नजरअंदाज किया जाता है। यह इस उत्तर के अर्थ को प्रभावित नहीं करता है।
लोर्ने

8

सिंक्रोनस को उसी समय के रूप में परिभाषित किया गया है।

एसिंक्रोनस को एक ही समय में नहीं होने के रूप में परिभाषित किया गया है।

यह वही है जो पहले भ्रम का कारण बनता है। सिंक्रोनस वास्तव में समानांतर के रूप में जाना जाता है। जबकि अतुल्यकालिक अनुक्रमिक है, ऐसा करें, फिर ऐसा करें।

अब पूरी समस्या एक अतुल्यकालिक व्यवहार को मॉडलिंग करने के बारे में है, क्योंकि आपको कुछ ऑपरेशन मिला है जिसे शुरू करने से पहले दूसरे की प्रतिक्रिया की आवश्यकता है। इस प्रकार यह एक समन्वय समस्या है, आप कैसे जानेंगे कि आप अब उस ऑपरेशन को शुरू कर सकते हैं?

सबसे सरल समाधान को अवरुद्ध करने के रूप में जाना जाता है।

अवरोधन तब होता है जब आप बस दूसरी चीज के लिए इंतजार करने का विकल्प चुनते हैं और आपको उस ऑपरेशन पर आगे बढ़ने से पहले प्रतिक्रिया देना होता है जिसकी उसे आवश्यकता थी।

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

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

यही कारण है कि गैर-अवरोधक और अतुल्यकालिक के रूप में ज्ञात दो अन्य समाधान खेलने में आते हैं।

जब आप ऑपरेशन किए जाने का इंतजार करते हैं तो गैर-अवरुद्ध तब होता है जब आप अन्य असंबंधित चीजें करना चुनते हैं। जैसा कि आप फिट देखते हैं प्रतिक्रिया की उपलब्धता पर वापस जाँच करना।

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

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

यहाँ अतुल्यकालिक आता है।

एसिंक्रोनस तब होता है जब आप अन्य असंबंधित चीजों को करना चुनते हैं जब आप ऑपरेशन किए जाने की प्रतीक्षा करते हैं। हालाँकि, इस पर जाँच करने के बजाय, आप किसी अन्य चीज़ की जाँच का काम सौंपते हैं, आप स्वयं ऑपरेशन या वॉचर हो सकते हैं, और आपके पास वह चीज़ है जो आपको सूचित करती है और संभवतया आपको तब रोकती है जब प्रतिक्रिया उपलब्ध होती है, ताकि आप दूसरे ऑपरेशन के लिए आगे बढ़ सकें इसकी जरूरत है।

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

तो इस एक के लिए, आप अपने टोस्टर को अपग्रेड करने का निर्णय लेते हैं ताकि जब टोस्ट किया जाए तो वह भीग जाए। आप लगातार सुन रहे होते हैं, यहां तक ​​कि जब आप व्यंजन कर रहे होते हैं। बीप सुनने पर, आप अपनी स्मृति में कतारबद्ध हो जाते हैं कि जैसे ही आप अपने वर्तमान पकवान को धो रहे हैं, आप रुक जाएंगे और टोस्ट पर मक्खन डालेंगे। या आप वर्तमान डिश की धुलाई को रोकना चुन सकते हैं, और तुरंत टोस्ट से निपट सकते हैं।

यदि आपको बीप सुनने में परेशानी होती है, तो आप अपने साथी को टोस्टर देखने के लिए, और टोस्ट तैयार होने पर बता सकते हैं। आपका साथी खुद ही उपरोक्त तीन में से किसी भी रणनीति को चुन सकता है ताकि टोस्टर को देखने के अपने कार्य को समन्वित कर सके और आपको बता सके कि वे कब तैयार हैं।

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

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

संपादित करें:

हालांकि यह पहले से ही लंबा है, मैं यह भी चाहता हूं कि यह पूरा हो जाए, इसलिए मैं दो और बिंदु जोड़ूंगा।

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

हमारे उदाहरण में यह टोस्टर को शुरू करने, फिर डिशवॉशर, फिर माइक्रोवेव आदि, और फिर उनमें से किसी पर इंतजार करने जैसा होगा। यदि आप टोस्टर की जांच करेंगे कि क्या यह किया गया है, यदि नहीं, तो आप डिशवॉशर की जांच करेंगे, यदि नहीं, तो माइक्रोवेव और फिर से।

2) भले ही मेरा मानना ​​है कि यह एक बड़ी गलती है, लेकिन एक समय में एक चीज का मतलब समकालिक होता है। और एक समय में कई चीजों को अतुल्यकालिक। इस प्रकार आप ब्लॉकिंग और नॉन-ब्लॉकिंग को संदर्भित करने के लिए सिंक्रोनस ब्लॉकिंग और नॉन-ब्लॉकिंग का उपयोग करेंगे। और असिंक्रोनस ब्लॉकिंग और नॉन-ब्लॉकिंग का उपयोग मल्टीप्लेक्स और ईवेंट के लिए किया जाता है।

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


निश्चित नहीं है कि आपने क्यों कहा "एक ही समय में सिंक्रोनस को परिभाषित किया जाता है।" पूरा विचार यह है कि यह समवर्ती नहीं है, उर्फ ​​एक ही समय में नहीं हो रहा है।
हेल्सिंग

यह एक महान सादृश्य था! आपने अभी इसे टोस्ट किया है!
डी-कोडर

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

@ हेलिंग इसके अलावा, समवर्ती समानांतर के समान नहीं है। इसका मतलब यह नहीं है कि दो चीजें एक ही समय में हो रही हैं, इसका मतलब केवल प्रगति पर अधिक है फिर उनमें से किसी के खत्म होने से पहले एक चीज बनती है। कि समानांतर के साथ पूरा किया जा सकता है, या बस interleaving, उर्फ ​​कार्य स्विचन के साथ।
डिडिएर ए।

3

कॉल को अवरुद्ध करना : कॉल पूरा होने पर ही नियंत्रण लौटाता है।

नॉन ब्लॉकिंग कॉल: नियंत्रण तुरंत लौटाता है। बाद में ओएस किसी तरह इस प्रक्रिया को सूचित करता है कि कॉल पूरा हो गया है।


सिंक्रोनस प्रोग्राम: एक प्रोग्राम जो ब्लॉकिंग कॉल का उपयोग करता है। कॉल के दौरान फ्रीज न करने के लिए इसमें 2 या अधिक थ्रेड्स होने चाहिए (इसीलिए इसे सिंक्रोनस कहा जाता है - थ्रेड्स सिंक्रोनाइज होते हैं)।

एसिंक्रोनस प्रोग्राम: एक प्रोग्राम जो नॉन ब्लॉकिंग कॉल का उपयोग करता है । इसमें केवल 1 धागा हो सकता है और अभी भी इंटरैक्टिव हो सकता है।


1
गैर-अवरोधक कॉल: जितना संभव हो उतना तुरंत किया जा सकता है के बाद नियंत्रण रिटर्न; विधि इंगित करती है कि कितना किया गया था। यह एक एसिंक्रोनस कॉल से अलग है, जो आपको अवरुद्ध कॉल के लिए वर्णित व्यवहार करता है।
सुपरकट

0

वे केवल वर्तनी में भिन्न हैं। वे क्या उल्लेख करते हैं, इसमें कोई अंतर नहीं है। तकनीकी होने के लिए आप कह सकते हैं कि वे जोर में भिन्न हैं। गैर अवरोधन प्रवाह को नियंत्रित करने के लिए संदर्भित करता है (यह ब्लॉक नहीं करता है।) एसिंक्रोनस उस घटना को संदर्भित करता है जब ईवेंट डेटा को नियंत्रित किया जाता है (सिंक्रोनस नहीं।)।


0

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


-2

ब्लॉकिंग: आदिम (सिंक या async) के प्रसंस्करण के पूरा होने के बाद पूर्ववर्ती निवेश को नियंत्रित करता है

गैर अवरुद्ध: आह्वान के तुरंत बाद रिटर्न को नियंत्रित करना


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