我正在尝试创建一个异步通道,并且一直在查看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是什么意思?缓冲区大小具体代表/限制了什么?
Answers:
缓冲区大小是可以在不发送阻塞的情况下发送到通道的元素数。默认情况下,通道的缓冲区大小为0(可通过来获得此值make(chan int)
)。这意味着每个发送都会阻塞,直到另一个goroutine从通道接收到为止。缓冲区大小为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