【发布时间】:2015-03-21 21:09:05
【问题描述】:
在 Rob Pike 的 Google IO talk 关于 Go 并发模式中,他展示了 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
}
}
【问题讨论】:
-
或
make(chan Result, len(replicas))。如果您不只是想让其他 goroutine 运行完成然后被清理,而是想要一种方法让它们死掉,请查看 context package。 -
也缺少错误处理,因为查询可能会失败。