2013-02-27 97 views
20

buffered चैनलों के लिए उपयोग के मामले क्या हैं? अगर मैं कई समानांतर क्रियाएं चाहता हूं तो मैं केवल डिफ़ॉल्ट, सिंक्रोनस चैनल eq का उपयोग कर सकता हूं।एक buffered चैनल का उपयोग कब करें?

package main 
import "fmt" 
import "time" 

func longLastingProcess(c chan string) { 
    time.Sleep(2000 * time.Millisecond) 
    c <- "tadaa" 
} 

func main() { 
    c := make(chan string) 
    go longLastingProcess(c) 
    go longLastingProcess(c) 
    go longLastingProcess(c) 
    fmt.Println(<- c) 
} 

क्या बफर आकार बढ़ाने के लिए व्यावहारिक मामलों हो सकता है?

उत्तर

0

यह एक कठिन सवाल है कि कार्यक्रम गलत है: यह एक goroutine से संकेत प्राप्त करने के बाद बाहर निकलता है, लेकिन तीन शुरू कर दिए गए थे। चैनल को बफर करना इसे अलग नहीं बनाता है।

संपादित करें: उदाहरण के लिए, यहां चैनल buffers चैनल के बारे में सामान्य चर्चा है। और कुछ exercise। और इसके बारे में book chapter

+0

अरे, प्रश्न buffered चैनलों के लिए वास्तविक जीवन उपयोग परिदृश्यों के बारे में है। ऊपर दिया गया उदाहरण सचमुच सिर्फ एक उदाहरण है। – Dante

+0

buffered चैनल का उपयोग करके किए गए कार्य पर काफी निर्भर करता है। अद्यतन उत्तर देखें। – zzzz

3

बुफर्ड चैनल प्रेषक के लिए तब तक अवरुद्ध नहीं हैं जब तक कि अभी भी कमरा है। यह प्रतिक्रिया और थ्रूपुट बढ़ा सकता है।

एक बफर किए गए चैनल पर कई आइटम भेजना सुनिश्चित करता है कि उन्हें उस क्रम में संसाधित किया जाता है जिसमें उन्हें भेजा जाता है।

से प्रभावी जाओ (उदाहरण के साथ): "A buffered channel can be used like a semaphore, for instance to limit throughput."

सामान्य में, वहाँ कई उपयोग-मामले और चैनल उपयोग के पैटर्न हैं, तो यह एक थका देने जवाब नहीं है।

मान लीजिए आप अपने चैनल एक कार्य कतार प्रतिनिधित्व करने के लिए, ताकि एक कार्य अनुसूचक कतार में नौकरियों भेज सकते हैं चाहते हैं, और एक कार्यकर्ता धागा उपभोग कर सकते हैं:

8

एक भी, थोड़ा और अधिक ठोस उपयोग के मामले देने के लिए चैनल में इसे प्राप्त करके एक नौकरी।

मान लीजिए कि, सामान्य रूप से आप उम्मीद करते हैं कि प्रत्येक नौकरी समय-समय पर संभाली जाए, शेड्यूलर को शेड्यूल करने के लिए कार्यकर्ता के लिए कार्य करने के लिए अधिक समय लगता है।

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

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

12

आम तौर पर, चैनलों में बफरिंग प्रदर्शन कारणों से फायदेमंद है।

एक कार्यक्रम एक घटना प्रवाह या डेटा प्रवाह दृष्टिकोण का उपयोग कर बनाया गया है, चैनल एक प्रक्रिया और एक अन्य (मैं टोनी होरे के दशक में के रूप में ही अर्थ में शब्द प्रक्रिया का उपयोग के बीच पारित करने के लिए घटनाओं के लिए साधन उपलब्ध कराते हैं अनुक्रमिक प्रक्रियाओं को संचारित करना (सीएसपी), यानि प्रभावी रूप से goroutine के साथ समानार्थी समानार्थी)।

  • ऐसे समय होते हैं जब किसी प्रोग्राम को लॉक-चरण सिंक्रनाइज़ेशन में रहने के लिए इसके घटकों की आवश्यकता होती है। इस मामले में, unbuffered चैनलों की आवश्यकता है।

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

  • छोटे बफर (example) वाले चैनलों का उपयोग करके उपन्यास थ्रॉटल संरचनाएं संभव हो गई हैं।

  • विशेष ओवरराइटिंग या occam और प्रक्रियाओं है कि अन्यथा शायद गतिरोध होगा का एक चक्र (या पाश) के विशेष मामले फिक्सिंग के लिए jcsp में इस्तेमाल चैनलों की हानिपूर्ण रूपों रहे हैं। यह ओवरराइटिंग गोरौटाइन बफर (example) लिखकर गो में भी संभव है।

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

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

+2

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

2

यदि प्रेषक की तुलना में चैनल का रिसीवर हमेशा धीमा होता है तो किसी भी आकार का बफर अंततः उपभोग किया जाएगा। यह आपको एक ऐसे चैनल के साथ छोड़ देगा जो आपके जाने-माने चैनल के रूप में अक्सर आपके जाने के लिए रुक जाता है ताकि आप एक अनफुक्टेड चैनल का भी उपयोग कर सकें।

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

एक बफर किए गए चैनल के विकल्प के रूप में यह विस्फोट/बैचों से निपटने के लिए चैनल पर एक सरणी युक्त एक सरणी या संरचना भेजना बेहतर हो सकता है।