비동기 채널을 만들려고하는데 http://golang.org/ref/spec#Making_slices_maps_and_channels를 살펴 보았습니다 .
c := make(chan int, 10) // channel with a buffer size of 10
버퍼 크기가 10이라는 것은 무엇을 의미합니까? 버퍼 크기는 구체적으로 무엇을 나타내거나 제한합니까?
비동기 채널을 만들려고하는데 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