5
想象一下下面的代碼:goroutines垃圾是否與他們的渠道一起收集?
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
}
這是否泄漏通道和一個夠程或不會去承認c
消失,且夠程可以退出?
如果通道的緩衝區大小爲2,答案會不同嗎?
因此,即使通道超出範圍且永遠不能再次讀取,通道塊的寫入也會被阻止。我不知道這是一個錯誤還是一個功能。 – AndreKR
是的,即使沒有接收器,發送也會阻止。可以編寫運行時來檢測應用程序何時完成在此特定示例中的頻道接收,但它不是運行時通常可檢測到的內容。 –
需要注意的是,還有一個「非阻塞發送」功能可以解決這個問題 - 您可以將通道上的緩衝區設置爲1,並且每個通道都可以無阻塞地發送。在這裏更詳細地描述:https://blog.golang.org/go-concurrency-patterns-timing-out-and –