And*_*eKR 6 channel go 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
}
Run Code Online (Sandbox Code Playgroud)
这是否泄漏了一个频道和goroutine,或者Go认识到它c已经消失并且goroutine可以退出?
如果通道的缓冲区大小为2,答案是否会有所不同?
如果通道未缓冲,则匿名函数之一将不会返回。该程序泄漏了一个 goroutine 和通道。
如果通道的缓冲区大小大于或等于 1,则两个匿名函数都将返回。goroutines 和 channel 使用的资源将被回收。
缓冲区大小为 1 就足以防止泄漏。该函数waitForOneOfTwoProcesses接收发送到 的值之一c。发送到的第二个值c缓冲在通道中(由 GC 收集)。
另一种确保 goroutine 返回的方法是使用非阻塞发送。将这些c <- true行替换为:
select {
case c <- true:
default:
}
Run Code Online (Sandbox Code Playgroud)