【问题标题】:What is channel buffer size?什么是通道缓冲区大小?
【发布时间】:2012-08-10 05:53:17
【问题描述】:

我正在尝试创建一个异步通道,我一直在查看http://golang.org/ref/spec#Making_slices_maps_and_channels

c := make(chan int, 10)         // channel with a buffer size of 10

缓冲区大小为 10 是什么意思?缓冲区大小具体代表/限制什么?

【问题讨论】:

  • here 及更多
  • 参见here 也很有帮助。非常直接且易于理解:)

标签: go channel


【解决方案1】:

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

【讨论】:

  • 好答案。 Effective Go 有一个很好的章节,标题为“并发”,阐述了通道。强烈推荐:golang.org/doc/effective_go.html
  • 我搞砸了,make(chan int, 1) 允许在阻塞之前将 3 个值传递到我的通道中(使用 log.Printlns 测试它),默认是在阻塞之前让 2 .知道为什么:
  • @Mauricio 这听起来很奇怪。我刚刚在本地使用 Go 1.8.3 进行了测试,还使用了 golang.org 的“Try Go”功能,在这两种情况下,它的行为仍然与我的回答中记录的一样。
  • 感谢您的回复,但实际上我误解了打印到控制台的数据。它确实像你描述的那样工作。
【解决方案2】:

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

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

您可以使用代码here

【讨论】:

    【解决方案3】:
    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

    【讨论】:

      猜你喜欢
      • 2013-11-19
      • 2011-04-24
      • 2011-07-10
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      相关资源
      最近更新 更多