goroutines垃圾是否与他们的渠道一起收集?

时间:2016-06-29 04:42:20

标签: go channel goroutine

想象一下以下代码:

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,答案是否会有所不同?

1 个答案:

答案 0 :(得分:4)

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

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

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

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

 select {
 case c <- true:
 default:
 }