我正在阅读 go programming language 书,第 8.4 章中有这个例子
func mirroredQuery() string{
responses := make(chan string, 3)
go func() { responses <- request("asia.gopl.io") }()
go func() { responses <- request("americas.gopl.io") }()
go func() { responses <- request("europe.gopl.io") }()
return <- responses // return the quickest response
}
还有这个评论
如果我们使用一个无缓冲的通道,那么两个较慢的 goroutines 会卡住试图在一个没有 goroutine 接收到的通道上发送它们的响应。
这个评论本身是有道理的。但是mirroredQuery在缓冲情况下返回时两个慢 goroutine 会发生什么?他们是否仍然跑完或被取消?
编辑:我知道如果主要的 goroutnine 退出,那么无论它们是否运行,2 个较慢的 goroutines 都会“消失”。但是如果 main goroutine 还在运行,mirroredQuery()已经返回了,那 2 个 slow goroutines 会跑完吗?基本上,退货responses后还存在吗?mirroredQuery如果是这样,那么 2 个慢 goroutine 似乎原则上可以完成;如果不是,那么我们仍然像无缓冲情况一样有泄漏?
幕布斯7119047
相关分类