एक कोरटाइन क्या है? वे कैसे संगामिति से संबंधित हैं?
एक कोरटाइन क्या है? वे कैसे संगामिति से संबंधित हैं?
जवाबों:
Coroutines और concurrency काफी हद तक ऑर्थोगोनल हैं। Coroutines एक सामान्य नियंत्रण संरचना है जिसके द्वारा प्रवाह नियंत्रण को सहकारी रूप से दो अलग-अलग रूटीनों के बीच बिना लौटे पास किया जाता है।
पायथन में 'उपज' कथन एक अच्छा उदाहरण है। यह एक कोरटाइन बनाता है। जब 'उपज' का सामना किया जाता है, तो फ़ंक्शन की वर्तमान स्थिति बच जाती है और कॉलिंग फ़ंक्शन पर नियंत्रण वापस आ जाता है। कॉलिंग फ़ंक्शन तब निष्पादन को वापस उपज समारोह में स्थानांतरित कर सकता है और इसकी स्थिति उस बिंदु पर बहाल हो जाएगी जहां 'उपज' का सामना करना पड़ा था और निष्पादन जारी रहेगा।
Coroutines are a general control structure whereby flow control is cooperatively passed between two different routines without returning.
<- यह है संगामिति। आप जिस शब्द की तलाश कर रहे हैं, वह समानता है।
orthogonal = Not similar to each other
?
orthogonal
इसका मतलब है "एक दूसरे से स्वतंत्र"।
लुआ में प्रोग्रामिंग से , " Coroutines
" अनुभाग:
एक कोरटाइन एक धागे के समान है (मल्टीथ्रेडिंग के अर्थ में): यह निष्पादन की एक पंक्ति है, अपने स्वयं के स्टैक के साथ, अपने स्वयं के स्थानीय चर और अपने स्वयं के अनुदेश सूचक के साथ; लेकिन यह वैश्विक चर और अन्य कोरटाइन के साथ और कुछ भी साझा करता है। थ्रेड्स और कोरटाइन्स के बीच मुख्य अंतर यह है कि, अवधारणात्मक (या सचमुच, एक मल्टीप्रोसेसर मशीन में), थ्रेड्स के साथ एक प्रोग्राम समानांतर में कई थ्रेड चलाता है। दूसरी ओर, कॉरआउट, सहयोगी होते हैं: किसी भी समय, कोरटाइन के साथ एक प्रोग्राम केवल अपने एक कॉरआउट में चल रहा होता है, और यह रनिंग कॉरआउट अपने निष्पादन को केवल तभी निलंबित करता है, जब वह स्पष्ट रूप से निलंबित होने का अनुरोध करता है।
तो मुद्दा यह है: Coroutines "सहयोगी" हैं। यहां तक कि मल्टी-कोर सिस्टम में, किसी भी समय केवल एक कोरटाइन चल रहा है (लेकिन कई धागे समानांतर में चल सकते हैं)। कोरटाइन के बीच गैर-निवारक है, चल रहे कोरआउट को स्पष्ट रूप से निष्पादन को त्यागना होगा।
" concurrency
" के लिए, आप रोब पाइक की स्लाइड का उल्लेख कर सकते हैं :
Concurrency स्वतंत्र रूप से निष्पादित संगणना की रचना है।
इसलिए कॉरटीन ए के निष्पादन के दौरान, यह कॉरटीन बी को नियंत्रित करता है। फिर कुछ समय के बाद, कॉरटीन बी कॉरटाइन ए पर वापस नियंत्रण करता है, क्योंकि कोरटाइन के बीच निर्भरता होती है , और उन्हें अग्रानुक्रम में चलना चाहिए, इसलिए दो कॉरटाइन समवर्ती नहीं हैं ।
मुझे अधिकांश उत्तर बहुत अधिक तकनीकी लगे, भले ही यह एक तकनीकी प्रश्न हो। मेरे पास एक कठिन समय था कि आप कोरटाइन प्रक्रिया को समझने की कोशिश करें। मैं इसे प्राप्त करना चाहता हूं, लेकिन फिर मैं इसे प्राप्त नहीं करता।
मुझे यह उत्तर बहुत मददगार लगा:
https://dev.to/thibmaek/explain-coroutines-like-im-five-2d9
इदान आर्य से उद्धृत करने के लिए:
अपनी कहानी बनाने के लिए, मैं इसे इस तरह से रखूँगा:
आप कार्टून देखना शुरू करते हैं, लेकिन यह इंट्रो है। इंट्रो देखने के बजाय आप गेम में स्विच करते हैं और ऑनलाइन लॉबी में प्रवेश करते हैं - लेकिन इसमें 3 खिलाड़ियों की आवश्यकता होती है और केवल आप और आपकी बहन इसमें हैं। अपने होमवर्क में शामिल होने के लिए किसी अन्य खिलाड़ी का इंतजार करने के बजाय, और पहले प्रश्न का उत्तर दें। दूसरे प्रश्न में एक YouTube वीडियो का लिंक है जिसे आपको देखने की आवश्यकता है। आप इसे खोलते हैं - और यह लोड करना शुरू कर देता है। इसे लोड करने के लिए इंतजार करने के बजाय, आप कार्टून पर वापस जाते हैं। इंट्रो खत्म हो गया है, इसलिए आप देख सकते हैं। अब इश्तेहार हैं - लेकिन इस बीच एक तीसरा खिलाड़ी भी शामिल हो गया है, इसलिए आप इस खेल को बंद कर दें ...
विचार यह है कि आप कार्यों को वास्तव में तेजी से स्विच नहीं करते हैं ताकि यह दिख सके कि आप एक ही बार में सब कुछ कर रहे हैं। आप उस समय का उपयोग करते हैं जब आप कुछ करने के लिए (IO) अन्य चीजों को करने के लिए इंतजार कर रहे होते हैं जिन्हें आपके प्रत्यक्ष ध्यान की आवश्यकता होती है।
निश्चित रूप से लिंक की जाँच करें, और भी बहुत कुछ है जो मैं सब कुछ उद्धृत नहीं कर सकता।
Coroutine, Subroutine / धागे के समान है। अंतर यह है कि एक बार कॉल करने वाले ने एक सबरूटीन / थ्रेड्स मंगवाए, यह कभी भी कॉलर फ़ंक्शन पर वापस नहीं आएगा। लेकिन एक कोरटाइन फोन करने वाले को कोड के कुछ टुकड़े को निष्पादित करने के बाद वापस आ सकता है और कॉल करने वाले को अपने स्वयं के कोड को निष्पादित करने की अनुमति देता है और कोरटाइन बिंदु पर वापस आ जाता है जहां उसने निष्पादन रोक दिया और वहां से जारी रहा। अर्थात। एक coroutine में एक से अधिक प्रवेश और निकास बिंदु हैं
मूल रूप से, दो प्रकार के Coroutines हैं:
कोटलिन स्टैकलेस कोरआउट्स को लागू करता है - इसका मतलब है कि कोरआउट्स का अपना स्टैक नहीं है, इसलिए वे देशी धागे पर मैप नहीं करते हैं।
ये कॉरआउट शुरू करने के कार्य हैं:
launch{}
async{}
आप यहाँ से और जान सकते हैं:
https://www.kotlindevelopment.com/deep-dive-coroutines/
https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9
से अजगर coroutine :
पायथन कोऑउटिन का निष्पादन निलंबित किया जा सकता है और कई बिंदुओं पर फिर से शुरू किया जा सकता है (कोरटाइन देखें)। एक coroutine फ़ंक्शन के शरीर के अंदर, प्रतीक्षा और एस्किंस पहचानकर्ता आरक्षित कीवर्ड बन जाते हैं; प्रतीक्षा अभिव्यक्तियाँ, के लिए async और async के साथ केवल coroutine फ़ंक्शन निकायों में उपयोग किया जा सकता है।
एक कोरआउट एक फ़ंक्शन है जो बाद में फिर से शुरू होने के लिए निष्पादन को निलंबित कर सकता है । Coroutines स्टैकलेस होते हैं: वे कॉल करने वाले पर लौटकर निष्पादन को निलंबित कर देते हैं। यह अनुक्रमिक कोड के लिए अनुमति देता है जो एसिंक्रोनस रूप से निष्पादित करता है (जैसे स्पष्ट कॉलबैक के बिना गैर-अवरुद्ध I / O को संभालने के लिए), और आलसी-गणना वाले अनंत अनुक्रमों और अन्य उपयोगों पर एल्गोरिदम का भी समर्थन करता है।
दूसरे के जवाब से तुलना करें:
मेरी राय में, @ ट्विंकल की तरह ही बाद में फिर से शुरू होने वाला हिस्सा एक मुख्य अंतर है।
हालाँकि दस्तावेज़ के कई क्षेत्र अभी भी प्रगति पर हैं, हालाँकि, यह हिस्सा ज्यादातर उत्तर के समान है, सिवाय @ नान ज़ियाओ के
दूसरी ओर, कॉरआउट, सहयोगी होते हैं: किसी भी समय, कोरटाइन के साथ एक प्रोग्राम केवल अपने एक कॉरआउट में चल रहा होता है, और यह रनिंग कॉरआउट अपने निष्पादन को केवल तभी निलंबित करता है, जब वह स्पष्ट रूप से निलंबित होने का अनुरोध करता है।
चूंकि यह लुआ में कार्यक्रम से उद्धृत किया गया है, शायद यह भाषा से संबंधित है (वर्तमान में लुआ से परिचित नहीं है), सभी दस्तावेज़ों में केवल एक ही भाग का उल्लेख नहीं किया गया है ।
समवर्ती के साथ संबंध: कॉरआउट (C ++ 20)
का एक "निष्पादन" भाग है। यहाँ उद्धृत करने के लिए लंबा समय है।
विस्तार के अलावा, कई राज्य हैं।
When a coroutine begins execution
When a coroutine reaches a suspension point
When a coroutine reaches the co_return statement
If the coroutine ends with an uncaught exception
When the coroutine state is destroyed either because it terminated via co_return or uncaught exception, or because it was destroyed via its handle
@ user217714 के जवाब के तहत @Adam Arold की टिप्पणी के रूप में। यह निर्णायक है।
लेकिन यह मल्टीथ्रेडिंग से अलग है।
एसटीडी से :: धागा
थ्रेड्स कई फ़ंक्शन को समवर्ती रूप से निष्पादित करने की अनुमति देते हैं। संबंधित थ्रेड ऑब्जेक्ट (किसी भी ओएस शेड्यूलिंग देरी लंबित) के निर्माण पर थ्रेड्स तुरंत निष्पादन शुरू करते हैं, एक कंस्ट्रक्टर तर्क के रूप में प्रदान किए गए शीर्ष-स्तरीय फ़ंक्शन पर शुरू होते हैं। शीर्ष-स्तरीय फ़ंक्शन के रिटर्न मान को अनदेखा किया जाता है और यदि इसे अपवाद फेंककर समाप्त किया जाता है, तो std :: समाप्ति को कहा जाता है। शीर्ष-स्तरीय फ़ंक्शन अपने रिटर्न मान या कॉल करने वाले को अपवाद के रूप में संचारित कर सकता है std :: वादा या साझा चर को संशोधित करके (जिसमें सिंक्रनाइज़ेशन की आवश्यकता हो सकती है, देखें std :: mutex और std :: atomic)
चूंकि यह संक्षिप्तता है, इसलिए यह मल्टीथ्रेडिंग की तरह काम करता है, विशेषकर जब प्रतीक्षा अपरिहार्य है (ओएस परिप्रेक्ष्य से), इसलिए भी यह भ्रामक है।
एक कोरआउट एक विशेष प्रकार का उपप्रोग्राम है। बल्कि एक कॉलगर्ल और एक तथाकथित सबप्रोग्राम के बीच दास-संबंध जो पारंपरिक उपप्रोग्राम, कॉलर और कॉरटीन के साथ मौजूद हैं, अधिक समान हैं।
एक कोरआउट एक उपप्रोग्राम है जिसमें कई प्रविष्टियां हैं और उन्हें स्वयं नियंत्रित करता है - सीधे लुआ में समर्थित
इसे सममितीय नियंत्रण भी कहा जाता है: कॉल करने वाले और कॉरआउट को अधिक समान आधार पर कहा जाता है
कॉरआउट कॉल को फिर से शुरू करने का नाम दिया गया है
कोरटाइन का पहला रिज्यूमे इसकी शुरुआत है, लेकिन बाद में कॉल कॉइन में अंतिम निष्पादित स्टेटमेंट के बाद बिंदु पर दर्ज होता है
Coroutines बार-बार एक-दूसरे को फिर से शुरू करते हैं, संभवतः हमेशा के लिए
Coroutines प्रोग्राम यूनिट्स (coroutines) का अर्ध-समवर्ती निष्पादन प्रदान करते हैं; उनके निष्पादन में दखल है, लेकिन ओवरलैप नहीं किया गया है
मुझे लगता है कि इस लिंक से एक स्पष्टीकरण बहुत सीधे आगे है। उन उत्तरों में से कोई भी इस जवाब में अंतिम बुलेट बिंदु को छोड़कर समरूपता बनाम समानता की व्याख्या करने का प्रयास नहीं करता है ।
जो आर्मस्ट्रांग, पौराणिक द्वारा "प्रोग्रामिंग एरलांग" से उद्धृत :
एक समवर्ती कार्यक्रम संभावित रूप से एक समानांतर कंप्यूटर पर तेजी से चल सकता है।
समवर्ती कार्यक्रम एक समवर्ती प्रोग्रामिंग भाषा में लिखा गया कार्यक्रम है। हम प्रदर्शन, मापनीयता, या दोष सहिष्णुता के कारणों के लिए समवर्ती कार्यक्रम लिखते हैं।
समवर्ती प्रोग्रामिंग भाषा एक ऐसी भाषा है जिसमें समवर्ती कार्यक्रमों को लिखने के लिए स्पष्ट भाषा का निर्माण होता है। ये निर्माण प्रोग्रामिंग भाषा का एक अभिन्न हिस्सा हैं और सभी ऑपरेटिंग सिस्टम पर समान व्यवहार करते हैं।
समानांतर कंप्यूटर एक कंप्यूटर है जिसमें कई प्रोसेसिंग यूनिट (सीपीयू या कोर) होते हैं जो एक ही समय में चल सकते हैं।
इसलिए समरूपता समानता के समान नहीं है। आप अभी भी एकल-कोर कंप्यूटर पर समवर्ती कार्यक्रम लिख सकते हैं। समय-साझाकरण शेड्यूलर आपको यह महसूस कराएगा कि आपका कार्यक्रम समवर्ती रूप से चल रहा है।
समवर्ती कार्यक्रम में समानांतर कंप्यूटर में समानांतर चलने की क्षमता है लेकिन गारंटी नहीं है । OS आपको अपना प्रोग्राम चलाने के लिए केवल एक कोर दे सकता है।
इसलिए, संगामिति एक समवर्ती कार्यक्रम से एक सॉफ्टवेयर मॉडल है जिसका मतलब यह नहीं है कि आपका कार्यक्रम शारीरिक रूप से समानांतर में चल सकता है।
शब्द "कोरटाइन" दो शब्दों से बना है: "सह" (सहकारी) और "दिनचर्या" (कार्य)।
ए। क्या यह संगामिति या समानता को प्राप्त करता है?
सरल होने के लिए, आइए इसे सिंगल-कोर कंप्यूटर पर चर्चा करें ।
Concurrency OS से टाइम-शेयर्स द्वारा हासिल की जाती है। एक CPU CPU कोर पर अपने नियत समय फ़्रेम में अपने कोड को निष्पादित करता है। यह ओएस द्वारा पूर्वनिर्मित किया जा सकता है। इससे OS पर नियंत्रण भी हो सकता है।
दूसरी ओर, एक coroutine, थ्रेड के भीतर किसी अन्य coroutine पर नियंत्रण रखता है, OS पर नहीं। तो एक धागे के भीतर सभी कोरआउट्स अभी भी उस धागे के लिए समय सीमा का उपयोग करते हैं जो ओएस द्वारा प्रबंधित अन्य थ्रेड्स के लिए सीपीयू कोर की उपज के बिना।
इसलिए, आप उपयोगकर्ता द्वारा OS (या अर्ध-समानता) द्वारा समय-शेयरों को प्राप्त करने के बारे में सोच सकते हैं । Coroutines धागे को सौंपे गए उसी कोर पर चलते हैं जो उन coroutines को चलाता है।
क्या कोराटाइन समानता प्राप्त करता है? यदि यह सीपीयू-बाउंड कोड है, तो नहीं। समय-शेयरों की तरह, यह आपको लगता है कि वे समानांतर में चलते हैं, लेकिन उनके निष्पादन को ओवरलैप नहीं किया जाता है। यदि यह IO- बद्ध है, तो हाँ, यह आपके कोड द्वारा हार्डवेयर (IO उपकरणों) के समानांतर प्राप्त होता है।
ख। फ़ंक्शन कॉल के साथ अंतर?
जैसा कि चित्र दिखाता है, इसे return
नियंत्रण स्विच करने के लिए कॉल करने की आवश्यकता नहीं है । इसके बिना उपज दे सकते हैं return
। वर्तमान फ़ंक्शन फ़्रेम (स्टैक) पर एक coroutine सहेजता है और साझा करता है। जब आप रजिस्टर और स्थानीय चर को बचाने के लिए और कॉल स्टैक को रिवाइंड करने की जरूरत नहीं है, तो यह फ़ंक्शन की तुलना में बहुत हल्का है call ret
।
मैं @ user21714 के उत्तर पर विस्तार करूंगा। Coroutines निष्पादन के स्वतंत्र रास्ते हैं जो एक साथ नहीं चल सकते हैं। वे एक नियंत्रक पर निर्भर करते हैं - उदाहरण के लिए एक python
नियंत्रक पुस्तकालय - इन रास्तों के बीच स्विचिंग को संभालने के लिए। लेकिन इसके लिए कोऑउटिन को काम करने के लिए स्वयं को yield
या ऐसी संरचनाओं को लागू करने की आवश्यकता होती है जो उनके निष्पादन को रोक देते हैं।
इसके बजाय थ्रेड्स स्वतंत्र गणना संसाधनों पर और एक दूसरे के समानांतर चल रहे हैं। चूंकि वे विभिन्न संसाधनों पर हैं, इसलिए उपज के आह्वान की आवश्यकता नहीं है ताकि निष्पादन के अन्य रास्तों को आगे बढ़ने की अनुमति मिल सके।
जैसे एक - आप एक multihreaded कार्यक्रम शुरू करने से इस आशय देख सकते हैं jvm
आवेदन - जिसमें आपके के सभी आठ core i7
hyperthread कोर उपयोग किया जाता है: आप में 797% उपयोग देख सकते हैं Activity Monitor
या Top
। इसके बजाय जब एक विशिष्ट python
कार्यक्रम चल रहा हो - यहां तक कि एक साथ coroutines
या python threading
- उपयोग 100% पर अधिकतम होगा। यानी एक मशीन हाइपरथ्रेड।