为了账号安全,请及时绑定邮箱和手机立即绑定

通道缓冲区大小是多少?

通道缓冲区大小是多少?

Go
呼如林 2021-05-07 18:29:13
我正在尝试创建一个异步通道,并且一直在查看http://golang.org/ref/spec#Making_slices_maps_and_channels。c := make(chan int, 10)         // channel with a buffer size of 10缓冲区大小为10是什么意思?缓冲区大小具体代表/限制了什么?
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

缓冲区大小是在没有发送阻塞的情况下可以发送到通道的元素数。默认情况下,通道的缓冲区大小为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


查看完整回答
反对 回复 2021-05-17
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

以下代码说明了对非缓冲通道的阻塞:


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

您可以在此处使用代码。


查看完整回答
反对 回复 2021-05-17
?
FFIVE

TA贡献1797条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-05-17
  • 3 回答
  • 0 关注
  • 325 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信