在 Rob Pike关于 Go Concurrency Patterns的Google IO 演讲中,他提供了此代码作为如何从多个副本服务器中选择最快响应者的示例:
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 阻塞在通道写入上吗?
在演讲结束后的讨论中,一位听众似乎在问这个问题,但得到了一种轻松波浪式的回应。
我倾向于将第三行更改为这样的:
searchReplica := func(i int) {
select {
case c <- replicas[i](query):
default: // non-blocking write
}
}
慕森卡
相关分类