这是来自50 Shades Of Go: Traps, Gotchas and Common mistakes 的引述:
您还可以使用特殊的取消通道来打断工人。
func First(query string, replicas ...Search) Result {
c := make(chan Result)
done := make(chan struct{})
defer close(done)
searchReplica := func(i int) {
select {
case c <- replicas[i](query):
case <- done:
}
}
for i := range replicas {
go searchReplica(i)
}
return <-c
}
据了解,这意味着我们使用通道done提前中断工作人员而不等待完全执行(在我们的案例中执行replicas[i](query)。因此,我们可以从最快的工作人员(“First Wins Pattern”)收到结果,然后取消所有其他工人的工作并节省资源。
另一方面,根据规范:
对于语句中的所有情况,接收操作的通道操作数以及发送语句的通道和右侧表达式在输入“select”语句时按源顺序恰好计算一次。
据我了解,这意味着我们不能interrupt the workers,因为在任何情况下,所有工作人员都会评估功能replicas[i]query,然后才选择case <- done并完成他们的执行。
能否请您指出我推理中的错误?
慕桂英3389331
相关分类