小编典典

goroutine的垃圾是否与渠道一起收集?

go

想象以下代码:

func waitForOneOfTwoProcesses() {

    c := make(chan bool)
    go func() {
        time.Sleep(1 * time.Second)
        c<-true
    }()
    go func() {
        time.Sleep(2 * time.Second)
        c<-true
    }()
    <-c

}

这会泄漏通道和goroutine,还是Go识别出c已消失而goroutine可以退出?

如果通道的缓冲区大小为2,答案是否会有所不同?


阅读 206

收藏
2020-07-02

共1个答案

小编典典

如果通道未缓冲,则匿名函数之一将不会返回。该程序泄漏了goroutine和通道。

如果通道的缓冲区大小大于或等于1,则两个匿名函数都将返回。goroutines和channel使用的资源将被回收。

缓冲区大小为1足以防止泄漏。该函数waitForOneOfTwoProcesses接收发送到的值之一c。发送到的第二个值c在通道中缓冲(由GC收集)。

确保goroutines返回的另一种方法是使用非阻塞发送。将这些c <- true行替换为:

 select {
 case c <- true:
 default:
 }
2020-07-02