चैनल बफर आकार क्या है?


86

मैं एक अतुल्यकालिक चैनल बनाने की कोशिश कर रहा हूं और मैं http://golang.org/ref/spec#Making_slices_maps_and_channels देख रहा हूं ।

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

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


यहां और आगे देखें
इवान ब्लैक

यहाँ भी देखें सहायक बहुत सीधा और समझने में आसान :)
Ardi Nusawan

जवाबों:


161

बफर आकार उन तत्वों की संख्या है जो चैनल को बिना ब्लॉक किए भेजा जा सकता है। डिफ़ॉल्ट रूप से, एक चैनल का बफर आकार 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

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

Im इस के साथ खिलवाड़ करता है और बनाता है (चान इंट, 1) ब्लॉक करने से पहले मेरे चैनल में 3 मानों को पारित करने की अनुमति देता है (इसे log.Printlns के साथ परीक्षण करना), और डिफ़ॉल्ट को ब्लॉक करने से पहले 2 में अनुमति देता है। किसी भी विचार क्यों:
मौरिसियो

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

1
मैं प्रतिक्रिया की सराहना करता हूं, लेकिन मैं वास्तव में अपने कंसोल पर डेटा प्रिंटिंग की गलत व्याख्या कर रहा था। यह आपके द्वारा वर्णित की तरह काम करता है।
मॉरीशियो

10

निम्न कोड असंबद्ध चैनल के अवरोधन को दिखाता है:

// 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)

आप यहां कोड के साथ खेल सकते हैं


0
package main

import (
    "fmt"
    "time"
)

func receiver(ch <-chan int) {
    time.Sleep(500 * time.Millisecond)
    msg := <-ch
    fmt.Printf("receive messages  %d from the channel\n", msg)
}

func main() {
    start := time.Now()
    zero_buffer_ch := make(chan int, 0)
    go receiver(zero_buffer_ch)
    zero_buffer_ch <- 444
    elapsed := time.Since(start)    
    fmt.Printf("Elapsed using zero_buffer channel: %v\n", elapsed)

    restart := time.Now()
    non_zero_buffer_ch := make(chan int, 1)
    go receiver(non_zero_buffer_ch)
    non_zero_buffer_ch <- 4444
    reelapsed := time.Since(restart)
    fmt.Printf("Elapsed using non zero_buffer channel: %v\n", reelapsed)
}

परिणाम:

चैनल से 444 संदेश प्राप्त करें

शून्य_बफ़र चैनल का उपयोग कर समाप्त: 505.6729ms

गैर शून्य_बफ़र चैनल का उपयोग कर समाप्त: 0s

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.