2009-02-16 10 views
97

कोरआउटिन क्या है? वे समवर्ती से कैसे संबंधित हैं?कोरआउटिन क्या है?

+0

समवर्ती कोड जरूरी नहीं है में चलाने के लिए है

इन कार्यों coroutine शुरू करने के लिए कर रहे हैं "समांतर" (चलिए नए नियम पेश नहीं करते हैं)। – user1712447

+0

मैंने मानक सी के साथ एक कोरआउट लाइब्रेरी लिखी है, जो लिनक्स, बीएसडी और विंडोज के लिए चयन/पोल/ईप्ल/क्यूक्यू/आईओसीपी/विन जीयूआई संदेश का समर्थन करती है। यह https://github.com/acl-dev/libfiber में एक ओपन-सोर्स प्रोजेक्ट है। सलाह अच्छी होगी। –

उत्तर

80

कोरआउट और समरूपता काफी हद तक ऑर्थोगोनल हैं। Coroutines एक सामान्य नियंत्रण संरचना है जिससे प्रवाह नियंत्रण दो अलग-अलग दिनचर्या के बीच वापस लौटने के बिना सहकारी रूप से पारित किया जाता है।

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

+9

इस फ़ंक्शन को सीधे इस कोरआउट में लपेटने के साथ सीधे फ़ंक्शन को कॉल करने और कोरआउट से उपज करने के बीच क्या अंतर है? –

+1

यह स्पष्ट करना बेहतर हो सकता है कि इस संदर्भ में इन दोनों अवधारणाओं को वास्तव में 'ऑर्थोगोनल' नहीं है। आप निश्चित रूप से आकर्षित कर सकते हैं कि दो अवधारणाएं एक दूसरे के समान कैसे हैं। दो या दो से अधिक चीजों के बीच नियंत्रण पारित करने का विचार बहुत समान है। – steviejay

29

Programming in Lua से, "Coroutines" अनुभाग:

एक coroutine (बहु सूत्रण के अर्थ में) एक धागे के समान है: यह निष्पादन की एक पंक्ति है, अपने स्वयं के ढेर, अपने स्वयं के स्थानीय चर के साथ, और इसके अपने निर्देश सूचक; लेकिन यह वैश्विक चर और अन्य कोरआउट के साथ अन्य कुछ साझा करता है। धागे और कोरआउट के बीच मुख्य अंतर यह है कि, अवधारणात्मक रूप से (या शाब्दिक रूप से, एक मल्टीप्रोसेसर मशीन में), धागे के साथ एक कार्यक्रम समानांतर में कई धागे चलाता है। दूसरी ओर, कोरआउट, सहयोगी हैं: किसी भी समय, कोरआउट के साथ एक कार्यक्रम अपने कोरआउटों में से केवल एक चला रहा है, और यह चल रहा कोरआउटिन केवल तभी निलंबित होने का अनुरोध करता है जब यह स्पष्ट रूप से निलंबित होने का अनुरोध करता है।

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

"concurrency" के लिए, आप उल्लेख कर सकते हैं रोब पाईक slide:

कन्करेंसी स्वतंत्र रूप से क्रियान्वित करने संगणना की रचना है।

तो coroutine एक के निष्पादन के दौरान, यह नियंत्रण से गुजरता है तो फिर कुछ समय के बाद बी coroutine को, coroutine बी coroutine ए को वापस नियंत्रण गुजरता है के बाद से वहाँ निर्भरता coroutines के बीच है, और वे मिलकर चलाना चाहिए, इसलिए दो कोरआउट संगतता नहीं हैं।

+0

मैं इस जवाब को तब तक प्यार करता था जब तक कि मुझे अंतिम वाक्य नहीं मिला। इसका क्या मतलब है? क्या आपने "सहमति" गलत वर्तनी की थी? यदि ऐसा है, तो यह निष्कर्ष प्रदान की गई परिभाषा से मेल नहीं खाता है। या यह एक नया शब्द "concurreny" होने का मतलब है? उस शब्द का मतलब क्या है? –

+0

@ ErickG.Hagstrom: क्षमा करें, मैंने 'concurrency' गलत वर्तनी'। आपको क्यों लगता है कि निष्कर्ष प्रदान की गई परिभाषा से मेल नहीं खाता है? –

+0

Coroutines स्वतंत्र रूप से निष्पादित नहीं करते हैं। वे मोड़ लेते हैं, प्रत्येक दूसरे के काम के कुछ हिस्से को करने का इंतजार कर रहा है। वे सक्रिय रूप से एक-दूसरे के साथ समन्वय करते हैं। यह समेकन की रोब पिक्स परिभाषा के विपरीत है। –

6

कोरआउटिन subroutine/धागे के समान है। अंतर एक बार कॉलर ने एक सबराउटिन/धागे को बुलाया है, यह कभी भी कॉलर फ़ंक्शन पर वापस नहीं आ जाएगा। लेकिन कॉलर कुछ कोड के निष्पादन के बाद कॉलर पर वापस लौट सकता है, जिससे कॉलर अपने कुछ कोड निष्पादित कर सकता है और कोरआउटिन पॉइंट पर वापस आ सकता है जहां उसने निष्पादन रोक दिया और वहां से जारी रखा। यानी। एक coroutine एक से अधिक प्रवेश और निकास अंक

1

एक अलग टिप्पणी पर, अजगर में gevent पुस्तकालय एक coroutine आधारित नेटवर्किंग पुस्तकालय जो आप async नेटवर्क अनुरोधों की तरह धागे जैसे सुविधाओं देता है, बनाने और धागे को नष्ट करने में भूमि के ऊपर के बिना है। coroutine लाइब्रेरी का उपयोग greenlet है।

0
  • Coroutines महान Kotlin भाषा
  • Coroutines में उपलब्ध सुविधाओं अतुल्यकालिक लेखन, गैर अवरुद्ध कोड (और भी बहुत कुछ)
  • coroutine हल्के वजन धागे हैं का एक नया तरीका कर रहे हैं। हल्के वजन धागे का अर्थ यह है कि देशी धागे पर नक्शा नहीं लगाता है, इसलिए प्रोसेसर पर संदर्भ स्विचिंग की आवश्यकता नहीं है, इसलिए वे तेज़ हैं।
  • यह देशी धागे पर नहीं है
  • कोरआउट और धागे दोनों मल्टीटास्किंग हैं। लेकिन अंतर यह है कि उपयोगकर्ताओं द्वारा ओएस और कोरआउट द्वारा धागे प्रबंधित किए जाते हैं।

मूल रूप से, वहाँ Coroutines के दो प्रकार हैं:

  1. stackless
  2. Stackful

Kotlin लागू करता stackless coroutines - इसका मतलब है कि coroutines खुद ढेर की जरूरत नहीं है, इसलिए वे मूल धागे पर नक्शा नहीं बनाते हैं।

launch{} 

async{} 

आप यहाँ से अधिक जान सकते हैं:

https://www.kotlindevelopment.com/deep-dive-coroutines/

https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9

संबंधित मुद्दे