반응형
Golang-채널 버퍼 크기는 무엇입니까?
비동기 채널을 만들려고하는데 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 수신
Elapsed using zero_buffer channel: 505.6729ms
Elapsed using non zero_buffer channel: 0s
참고URL : https://stackoverflow.com/questions/11943841/golang-what-is-channel-buffer-size
반응형
'code' 카테고리의 다른 글
Docker 네트워킹 비활성화 됨 : 경고 : IPv4 전달이 비활성화되었습니다. (0) | 2020.10.21 |
---|---|
.NET-일반 컬렉션을 DataTable로 변환 (0) | 2020.10.21 |
Promise 배열을 순차적으로 실행하려면 어떻게해야합니까? (0) | 2020.10.21 |
스타일에 대한 Angular 2.0 바인딩 값 (0) | 2020.10.21 |
Count 속성 대 Count () 메서드? (0) | 2020.10.21 |