2013-08-05 21 views
32

Google I/O 2012 प्रस्तुति Go Concurrency Patterns में, रोब पाइक का उल्लेख है कि कई goroutines एक थ्रेड में रह सकते हैं। क्या इसका मतलब है कि उन्हें coroutines के रूप में लागू किया गया है? यदि नहीं, तो उन्हें कैसे लागू किया जाता है? स्रोत कोड के लिए लिंक का स्वागत किया जाएगा।क्या गो गोराउटिन एक कोरआउट है?

उत्तर

29

काफी नहीं। गो एफएक्यू अनुभाग Why goroutines instead of threads? बताता है:

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

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

2

गोरौटाइन निष्पादन का एक अलग "धागा" है। यह आईएमओ वास्तव में कोरआउटिन के बराबर नहीं है। पहले अनुमान में, goroutines वास्तविक ओएस धागे द्वारा कार्यान्वित किया जा सकता है। AFAIK, वह gccgo के शुरुआती संस्करणों का मामला था। एक और अंतर यह है कि goroutines preempted हो सकता है।

वर्तमान गो कंपाइलर्स goroutines को बहुत हल्के, उपयोगकर्ता स्थान "धागे" के रूप में लागू करते हैं। उदाहरण के लिए एक विशिष्ट विशेषता wrt। green threads यह है कि goroutines विभिन्न ओएस धागे में स्विच किया जा सकता है।

मुझे लगता है कि तुम यहाँ ब्याज की कुछ संबंधित बिट्स पा सकते हैं: एक goroutine एक उचित coroutine या बस इसी तरह अक्सर https://groups.google.com/forum/?fromgroups=#!forum/golang-nuts पर चर्चा की है कुछ है proc.c

+0

'preempted' का क्या अर्थ है? –

+0

@ स्लावोज़: http://en.wikipedia.org/wiki/Preemption_(computing देखें)। संक्षेप में, सहकारी शेड्यूलिंग (कोरआउट, उपज, ...) और प्रीemptive शेड्यूलिंग (ओएस थ्रेड्स, गोरौटाइन, ...) – zzzz

+1

मुझे विश्वास नहीं है कि goroutines preemptively निर्धारित हैं। मैंने सोचा कि goroutines सिर्फ कुछ बिंदु हैं जिन पर वे एक संभावित संदर्भ स्विच के लिए शेड्यूलर के साथ जांच करते हैं (उदाहरण के लिए, फ़ंक्शन कॉल पर, i/o, आदि पर)। – weberc2

3

या नहीं। कुछ लोग इस तरह के subtleties के बारे में बहस कर सकते हैं, लेकिन इसके अधिकांश के लिए: goroutine एक coroutine है।

शेड्यूलर कैसे काम करता है यह समझने के लिए https://docs.google.com/document/d/1TTj4T2JO42uD5ID9e89oa0sLKhJYD0Y_kqxDv3I3XMw/edit पर एक नज़र डालें।

37

आईएमओ, एक कोरआउटिन का मतलब है स्पष्ट का समर्थन अन्य कोरआउटिन पर नियंत्रण स्थानांतरित करने के लिए है। यही है, प्रोग्रामर एक कोरआउटिन को एक तरीके से प्रोग्राम करता है जब वे निर्णय लेते हैं कि एक कोरआउट को निष्पादन को निलंबित करना चाहिए और उसके नियंत्रण को किसी अन्य कोरआउटिन (या तो इसे कॉल करके या लौटने/निकालने (आमतौर पर उपज कहा जाता है) से गुजरना चाहिए।

जाओ के "goroutines" एक और बात कर रहे हैं: वे परोक्ष कुछ अनिश्चित अंक जो हो सकता है जब goroutine के बारे में I/O पूर्णता की तरह कुछ (बाह्य) संसाधन पर सोने के लिए है, चैनल भेजने पर आत्मसमर्पण नियंत्रण इत्यादि। चैनल के माध्यम से राज्य साझा करने के साथ संयुक्त दृष्टिकोण प्रोग्रामर को कार्यक्रम तर्क को अनुक्रमिक लाइट-वेट प्रक्रियाओं के सेट के रूप में लिखने में सक्षम बनाता है जो स्पेगेटी कोड समस्या को कोरआउटिन और घटना-आधारित दृष्टिकोण दोनों के लिए सामान्य बनाता है।

कार्यान्वयन के संबंध में, मुझे लगता है कि वे बहुत कम हैं (दुर्भाग्य से बहुत प्रसिद्ध नहीं) "State Threads" library, बस काफी कम स्तर (जैसे गो libc या इस तरह की चीजों पर भरोसा नहीं करता है और सीधे बात करता है ओएस कर्नेल) — आप एसटी पुस्तकालय के लिए प्रारंभिक पत्र पढ़ सकते हैं जहां अवधारणा काफी अच्छी तरह से समझाया गया है।


वास्तव में, इन बातों coroutines लेकिन preemptive multitasking के तहत सही ओएस धागे, जहां प्रत्येक धागा समय में और किसी भी भी बिंदु पर गिरी द्वारा निलंबित किया जा सकता के साथ की तुलना में अधिक नियत के उन लोगों की तुलना में कम नियत हैं धागे के नियंत्रण का प्रवाह।

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