[go] 채널 버퍼 크기는 무엇입니까?

비동기 채널을 만들려고하는데 http://golang.org/ref/spec#Making_slices_maps_and_channels를 살펴 보았습니다 .

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

버퍼 크기가 10이라는 것은 무엇을 의미합니까? 버퍼 크기는 구체적으로 무엇을 나타내거나 제한합니까?



답변

버퍼 크기는 전송 차단없이 채널에 전송할 수있는 요소의 수입니다. 기본적으로 채널의 버퍼 크기는 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


답변

다음 코드는 버퍼링되지 않은 채널의 차단을 보여줍니다.

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

여기 에서 코드를 가지고 놀 수 있습니다 .


답변

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 수신

zero_buffer 채널을 사용하여 경과 : 505.6729ms

zero_buffer가 아닌 채널을 사용하여 경과 : 0s


답변