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


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.