Go 并发模式——这会留下挂起的 goroutines 吗?
Go Concurrency Pattern- will this leave hanging goroutines?
以 Rob Pike 的 Google IO talk on Go Concurrency Patterns, he presented this code 为例,说明如何从多个副本服务器中挑选最快的响应者:
func First(query string, replicas ...Search) Result {
c := make(chan Result)
searchReplica := func(i int) { c <- replicas[i](query) }
for i := range replicas {
go searchReplica(i)
}
return <-c
}
问题:这不会导致 N-1 个副本 goroutine 在通道写入时阻塞吗?
在演讲后的讨论中,一位听众似乎在问这个问题,但得到了一种得心应手的回答。
我倾向于将第 3 行更改为如下内容:
searchReplica := func(i int) {
select {
case c <- replicas[i](query):
default: // non-blocking write
}
}
你是对的。但这不适合一张幻灯片。他说的是并发模式,不一定是代码。
当然,我还是不会把代码放到幻灯片上...
以 Rob Pike 的 Google IO talk on Go Concurrency Patterns, he presented this code 为例,说明如何从多个副本服务器中挑选最快的响应者:
func First(query string, replicas ...Search) Result {
c := make(chan Result)
searchReplica := func(i int) { c <- replicas[i](query) }
for i := range replicas {
go searchReplica(i)
}
return <-c
}
问题:这不会导致 N-1 个副本 goroutine 在通道写入时阻塞吗?
在演讲后的讨论中,一位听众似乎在问这个问题,但得到了一种得心应手的回答。
我倾向于将第 3 行更改为如下内容:
searchReplica := func(i int) {
select {
case c <- replicas[i](query):
default: // non-blocking write
}
}
你是对的。但这不适合一张幻灯片。他说的是并发模式,不一定是代码。
当然,我还是不会把代码放到幻灯片上...