【问题标题】:Use of Buffered Channels of Length Zero使用长度为零的缓冲通道
【发布时间】:2019-06-05 10:55:56
【问题描述】:

我想知道为什么语言中存在长度为零的缓冲通道。根据我的经验,它们似乎只会产生僵局。到底有没有用?

【问题讨论】:

  • 无缓冲通道允许通过交换一个值来同步两个 goroutine。
  • 实际上,在 Go 中编程时的经验法则是,如果让通道缓冲解决了问题,那么您就有了逻辑错误。缓冲通道确实有用途(实际上是两种用途),但大多数时候您应该开始使用无缓冲通道。
  • “长度为零的缓冲通道”不存在。如果它的长度为零,则根据定义,它是无缓冲的。

标签: go channels


【解决方案1】:

大小为零的通道是无缓冲的。这意味着每次发送都会阻塞,直到另一个 goroutine 从通道接收。这个例子可以工作:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int, 0)
    go func() {
        for c := range ch {
            fmt.Println(c)
        }
    }()
    ch <- 1
    ch <- 2
    time.Sleep(time.Minute)
}

【讨论】:

    【解决方案2】:

    来自this answer(强调我的):

    默认情况下,通道的缓冲区大小为 0(您可以通过 make(chan int) 获得此值)。这意味着每次发送都会阻塞,直到另一个 goroutine 从通道接收到

    如果您收到死锁,则很可能是通道没有读取任何内容,或者某些内容的写入速度超过了您的读取速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-18
      • 2014-01-30
      • 2013-02-13
      • 1970-01-01
      • 2020-10-23
      • 2012-04-12
      • 1970-01-01
      • 2012-05-17
      相关资源
      最近更新 更多