2012-08-13 15 views
55

मैं एक एसिंक्रोनस चैनल बनाने की कोशिश कर रहा हूं और मैं http://golang.org/ref/spec#Making_slices_maps_and_channels देख रहा हूं।गोलांग - चैनल बफर आकार क्या है?

c := make(chan int, 10)   // channel with a buffer size of 10 

इसका मतलब क्या है कि बफर आकार 10 है? बफर आकार का प्रतिनिधित्व/सीमा क्या विशेष रूप से करता है?

+0

देखें [यहां] (http://tour.golang.org/concurrency/2) और आगे –

उत्तर

110

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

c := make(chan int, 1) 
c <- 1 // doesn't block 
c <- 2 // blocks until another goroutine receives from the channel 
+17

अच्छा उत्तर। प्रभावी गो के पास "कंसुरेंसी" नामक एक अच्छा अध्याय है जो चैनलों पर फैलता है। अत्यधिक अनुशंसित: http://golang.org/doc/effective_go.html – Levi

+0

मैं इसके साथ गड़बड़ कर रहा हूं और (चैन int, 1) ब्लॉक को रोकने से पहले अपने चैनल में 3 मानों को पारित करने की अनुमति देता है (लॉग.प्रिंटल के साथ इसका परीक्षण), और डिफ़ॉल्ट ब्लॉकिंग से पहले 2 दे रहा है। कोई विचार क्यों: – Mauricio

+0

@Mauricio वह बहुत अजीब लगता है। मैंने स्थानीय स्तर पर गो 1.8.3 का उपयोग करके और https://golang.org पर "कोशिश करें" कार्यक्षमता का उपयोग करके परीक्षण किया है, और दोनों मामलों में यह अभी भी मेरे उत्तर में दस्तावेज के रूप में व्यवहार करता है। –

2

निम्नलिखित कोड unbuffered चैनल को अवरुद्ध दिखाता है:

// to see the diff, change 0 to 1 
c := make(chan struct{}, 0) 
go func() { 
    time.Sleep(2 * time.Second) 
    <-c 
}() 
start := time.Now() 
c <- struct{}{} // block, if channel size is 0 
elapsed := time.Since(start) 
fmt.Printf("Elapsed: %v\n", elapsed) 

आप कोड here साथ निभा सकते हैं ।

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

  • कोई संबंधित समस्या नहीं^_^