असिंक्रोनस बनाम मल्टीथ्रेडिंग - क्या कोई अंतर है?


133

क्या एक अतुल्यकालिक कॉल हमेशा एक नया धागा बनाता है? दोनों के बीच क्या अंतर है?

क्या एक एसिंक्रोनस कॉल हमेशा एक नया धागा बना या उपयोग करता है?

विकिपीडिया कहता है :

कंप्यूटर प्रोग्रामिंग में, अतुल्यकालिक घटनाएं मुख्य कार्यक्रम प्रवाह के स्वतंत्र रूप से होने वाली हैं। अतुल्यकालिक क्रियाएं एक गैर-अवरुद्ध योजना में निष्पादित की जाने वाली क्रियाएं हैं, जो मुख्य कार्यक्रम के प्रवाह को प्रसंस्करण जारी रखने की अनुमति देती हैं।

मुझे पता है कि एसिंक्स कॉल सिंगल थ्रेड्स पर किया जा सकता है? यह कैसे हो सकता है?



1
जावास्क्रिप्ट में थ्रेड्स नहीं हैं, लेकिन इसमें एसिंक्रोनस मेथड कॉल्स हैं।
Ajedi32

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

जवाबों:


82

यह प्रश्न उत्तर देने के लिए बहुत सामान्य है।

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

एसिंक्रोनस का अर्थ है कि कॉलिंग थ्रेड बैठकर प्रतिक्रिया की प्रतीक्षा नहीं करता है, और न ही एसिंक्रोनस गतिविधि कॉलिंग थ्रेड में होती है।

इसके अलावा, आपको अधिक विशिष्ट प्राप्त करने की आवश्यकता है।


7
इसलिए मूल रूप से मैं यह कहने में सही हूं: प्रोसेसर-गहन कार्यों पर प्रसंस्करण लाभ प्रदान करने के लिए मल्टी-थ्रेडिंग == कई थ्रेड्स का उपयोग करना जो कि कई प्रोसेसर से [आदर्श रूप से] लाभान्वित करने में सक्षम हैं, साथ ही साथ अतुल्यकालिक स्थितियों में लाभ भी देते हैं। एसिंक्रोनसी == एक ऐसी प्रक्रिया है जो यह करती है, जबकि राज्य जिसे प्रक्रिया कहा जाता है उसे पूरा होने के लिए इंतजार नहीं करना पड़ता है। (आवश्यक रूप से ऐसा करने के लिए कई थ्रेड का उपयोग नहीं किया जा सकता है - अर्थात। अन्य हार्डवेयर घटक जिम्मेदारी ले सकते हैं)।
इवान सेवई

6
@ मिचेल - क्या आप बता सकते हैं कि एक सूत्र में अतुल्यकालिक प्रोग्रामिंग कैसे हो सकती है?
कुमार वैभव '

7
@KumarVaibhav - सबसे आम उदाहरण तब होता है जब एक एकल पंक्ति एक कतार से वस्तुओं पर काम करती है (उदाहरण के लिए, विंडोज संदेश कतार)। यदि प्रोग्राम में आइटम भेजने की आदत है, तो यह स्वयं की कतार (एक सामान्य पैटर्न) है, तो आइटम को भेजने वाला बिट कोड ऑपरेशन समाप्त होने की प्रतीक्षा नहीं करता है, बल्कि केवल रिटर्न करता है। मुख्य लूप द्वारा नियत समय में ऑपरेशन का ध्यान रखा जाएगा।
माइकल कोहेन

3
कोड कैसे लिखा जाता है और इसे कैसे निष्पादित किया जाता है, इसके बीच अंतर हो सकता है। उदाहरण के लिए, C # में, मेरे पास एक ऐसा तरीका हो सकता है जो एक async कार्य शुरू करता है, मेरी विधि पूरी तरह से async जागरूक है और कार्य पूरा होने की प्रतीक्षा किए बिना अन्य चीजें कर सकता है। हालाँकि, CLR मेरे कार्य को इनलाइन करने और इसे समान रूप से निष्पादित करने का निर्णय ले सकता है।
माइक

कौन सा धागा प्रतीक्षित कार्य को अंजाम देता है? किसी सिंक-सिंक के साथ चिह्नित विधि को तब तक सिंक्रोनाइज़ किया जाता है, जब तक वह प्रतीक्षित कीवर्ड तक नहीं पहुंच जाता है, इस बिंदु पर कौन सा धागा इस प्रतीक्षा-सक्षम कार्य को अंजाम देता है?

102

जब भी ऑपरेशन को एसिंक्रोनस रूप से करने की आवश्यकता होती है, तो सीपीयू को काम करने की आवश्यकता नहीं होती है, उस ऑपरेशन को एक और धागा पैदा किए बिना किया जा सकता है। उदाहरण के लिए, यदि async ऑपरेशन I / O है, तो CPU को I / O के पूरा होने का इंतजार नहीं करना है। इसे बस ऑपरेशन शुरू करने की आवश्यकता है, और फिर अन्य काम पर जा सकते हैं जबकि I / O हार्डवेयर (डिस्क नियंत्रक, नेटवर्क इंटरफ़ेस, आदि) I / O काम करता है। हार्डवेयर सीपीयू को तब बताता है जब वह सीपीयू को बाधित करके समाप्त हो जाता है, और ओएस तब आपके आवेदन में घटना को बचाता है।

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

यदि एसिंक्रोनस ऑपरेशन के लिए सीपीयू को काम करने की आवश्यकता होती है, तो आम तौर पर उस ऑपरेशन को दूसरे थ्रेड में होना होता है, ताकि यह वास्तव में अतुल्यकालिक हो। फिर भी, यह वास्तव में केवल अतुल्यकालिक होगा यदि एक से अधिक निष्पादन इकाई है।


1
अच्छी तरह से समझाया, धन्यवाद; लेकिन मेरा यहाँ एक सवाल है। आपने उल्लेख किया है कि "उदाहरण के लिए, यदि एसिंक्रोनस ऑपरेशन I / O है, तो CPU को I / O को पूरा करने के लिए प्रतीक्षा करने की आवश्यकता नहीं है। इसे केवल ऑपरेशन शुरू करने की आवश्यकता है"। मेरा सवाल यह है कि जब प्रोग्राम सिंगल थ्रेडेड है, और कोड लाइन 3 में कहें, तो आप I / O ऑपरेशन कहते हैं, फिर आप लाइन 3 में ऑपरेशन कैसे शुरू कर सकते हैं और I / O ऑपरेशन को पूरा किए बिना लाइन 4 को निष्पादित कर सकते हैं। ? मेरे लिए, मुझे I / O ऑपरेशन के पूरा होने की प्रतीक्षा किए बिना लाइन 4 को प्राप्त करने के लिए लाइन 3 में कोड को एक नए धागे में रखना है। [Java pgm परिप्रेक्ष्य]
स्पाइडरमैन

1
कारण यह है कि, हालांकि सीपीयू को इंतजार नहीं करना पड़ता है, सीपीयू I / O ऑपरेशन के पूरा होने का इंतजार करेगा ... मेरा मानना ​​है कि आपका दूसरा पैराग्राफ मेरी क्वेरी के लिए उत्तर है। ऐसे मामले में, मुझे यह निष्कर्ष निकालने की आवश्यकता है कि जावा में, अतुल्यकालिक कॉल को एक अलग धागे में निष्पादित करने की आवश्यकता है। कृपया मुझे सही करें अगर मैं गलत हूं या मुझे बताएं कि क्या मुझे एक नया SO पोस्ट करना है
स्पाइडरमैन

@spiderman कुछ भाषाओं, जैसे Node.js में एक Async प्रोग्रामिंग मॉडल है। भाषा और रनटाइम बिल्ट-इन प्रदान करते हैं जो लाइन 4 को एक ही धागे में निष्पादित करने की अनुमति देते हैं, यहां तक ​​कि आईओ ऑपरेशन पूरा होने से पहले भी। यह लाइन 3 द्वारा एक कॉलबैक प्रदान करते हुए प्राप्त किया जाता है जो आईओ के खत्म होने पर रनटाइम आह्वान करेगा।
जहाराली

शायद @spiderman ... OS का Async फ़ंक्शन केवल गलत या कुछ सीधे लौटाता है।
ब्यॉन्गिन यूं

18

नहीं, अतुल्यकालिक कॉल में हमेशा थ्रेड शामिल नहीं होते हैं।

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


12

जावास्क्रिप्ट एकल-पिरोया और अतुल्यकालिक है। जब आप XmlHttpRequest का उपयोग करते हैं, उदाहरण के लिए, आप इसे एक कॉलबैक फ़ंक्शन प्रदान करते हैं जिसे प्रतिक्रिया वापस आने पर एसिंक्रोनस रूप से निष्पादित किया जाएगा।

जॉन रेजिग ने संबंधित मुद्दे की एक अच्छी व्याख्या की है कि जावास्क्रिप्ट में टाइमर कैसे काम करते हैं


12

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


मैं थोड़ा असहमत होता। मैंने एक एकल थ्रेडेड HTTP सर्वर लिखा है जो एसिंक्स आईओ पूरा होने का उपयोग करके एक साथ कई अनुरोधों को संभालता है। Async को निष्पादन के कई रास्तों में होने वाली चीज़ों की आवश्यकता नहीं होती है, इसका मतलब है कि एकाधिक गणना धाराएँ ओवरलैप हो सकती हैं। इसे देखने का एक और तरीका यह है कि एक एकल थ्रेडेड ओएस पर, मेरे पास "एक साथ" चलने वाली 2 प्रक्रियाएं हो सकती हैं। प्रत्येक प्रक्रिया के दृष्टिकोण से, वे समकालिक रूप से चल रहे हैं। हालाँकि, OS के दृष्टिकोण से, यह async चल रहा है।
माइक

11

विंडोज में हमेशा गैर-प्रीमेप्टिव समय (संस्करण 2.13, 3.0, 3.1, आदि) के बाद से अतुल्यकालिक प्रसंस्करण होता था, संदेश लूप का उपयोग करके, वास्तविक थ्रेड्स का समर्थन करने से पहले। तो आपके प्रश्न का उत्तर देने के लिए, नहीं, अतुल्यकालिक प्रसंस्करण करने के लिए एक धागा बनाना आवश्यक नहीं है।


@ मार्की - यह दिलचस्प है कि समान शिष्टाचार में विभिन्न प्रणालियां कैसे विकसित होती हैं।
ओट्टोवियो डेसिओ

8

एसिंक्रोनस कॉल को उसी सिस्टम / डिवाइस पर होने की आवश्यकता नहीं है, जिस पर कॉल कॉल किया जाता है। इसलिए यदि प्रश्न है, क्या एक अतुल्यकालिक कॉल को वर्तमान प्रक्रिया में एक थ्रेड की आवश्यकता होती है, तो उत्तर नहीं है। हालाँकि, एसिंक्रोनस अनुरोध को संसाधित करने के लिए कहीं न कहीं निष्पादन का एक धागा होना चाहिए।

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

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


7

कुछ सिस्टम आपको कॉलबैक का उपयोग करके कुछ सुविधाओं के लिए कर्नेल में संगामिति का लाभ उठाने की अनुमति देते हैं। बल्कि अस्पष्ट उदाहरण के लिए, अतुल्यकालिक IO कॉलबैक का उपयोग मैक सिस्टम 6-8 के नो-प्रीमेप्टिव मल्टीटास्किंग दिनों में गैर-अवरुद्ध इंटरनेट सेवर को लागू करने के लिए किया गया था।

इस तरह से आपके पास समवर्ती निष्पादन धाराएं हैं " जैसे आप बिना धागे के प्रोग्राम करते हैं


5

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

एकल-थ्रेडेड अतुल्यकालिक कार्यक्रमों के उदाहरण हैं। कुछ इस तरह:

...do something
...send some async request
while (not done)
    ...do something else
    ...do async check for results

2

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

कभी-कभी, स्थिति के आधार पर, आप एक एसिंक्रोनस विधि को लागू करना चाहते हैं, लेकिन यह उपयोगकर्ता को तुल्यकालिक होने के लिए प्रकट कर सकते हैं (यानी जब तक अतुल्यकालिक विधि ने संकेत नहीं दिया है कि यह पूरा हो गया है)। यह Win32 APIs जैसे WaitForSingleObject के माध्यम से प्राप्त किया जा सकता है ।


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

यह विंडोज पर सच नहीं है। उदाहरण के लिए, ओवरलैप्ड I / O, अतुल्यकालिक है।
जेसन ओरेंडोर्फ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.