为什么将数据发送到没有缓冲的chan将阻止go例程

时间:2017-02-21 03:16:55

标签: go

运行以下代码:

func l(ch chan int)  {
    println("l being")
    ch<-1

    println("l after write")
    time.Sleep(time.Second*1)
    println("l goroutine down")
}

func main() {
    c := make(chan int)
    go l(c)
    println("main")

    time.Sleep(time.Second*9)
   println("main down")
}

您将获得以下结果

main
l being
main down

这意味着向chan发送数据会阻止当前的例程,我对这种行为感到惊讶。我知道来自chan的读取数据将阻止常规,并且很容易理解。但是发送数据到chan块是常规的,我认为它不够好,任何人都可以告诉我为什么Go-Lang有这个设计来帮助我理解?非常感谢你:))

1 个答案:

答案 0 :(得分:2)

您没有显示频道的创建,所以我假设它没有缓冲。无缓冲的通道无法保留任何项目,因此发送方将阻塞,直到收到该项目。如果创建缓冲区大小为 n 的缓冲通道,则发送操作不会阻止,除非通道中尚未收到 n 项。要创建缓冲通道,请将缓冲区大小传递给make,如下所示:

c := make(chan int, 10)

有关详细信息,请参阅https://golang.org/doc/effective_go.html#channels