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


82

비동기 채널을 만들려고하는데 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

답변:


157

버퍼 크기는 전송 차단없이 채널에 전송할 수있는 요소의 수입니다. 기본적으로 채널의 버퍼 크기는 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
좋은 대답입니다. Effective Go에는 채널에 대해 설명하는 "동시성"이라는 멋진 장이 있습니다. 추천 : golang.org/doc/effective_go.html
레위

나는 이것을 엉망으로 만들고 make (chan int, 1) 차단하기 전에 3 개의 값을 내 채널에 전달할 수 있으며 (log.Printlns로 테스트) 기본값은 차단하기 전에 2를 허용하는 것입니다. 이유 :
Mauricio

@Mauricio 꽤 이상하게 들립니다. 방금 Go 1.8.3을 로컬에서 사용하고 golang.org 에서 "Try Go"기능을 사용하여 테스트 했으며 두 경우 모두 제 답변에 설명 된대로 작동합니다.
Lily Ballard

1
나는 응답에 감사하지만 실제로 내 콘솔에 데이터 인쇄를 잘못 해석했습니다. 설명하신대로 작동합니다.
Mauricio

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.