我想向几台服务器询问数据(例如多个只读副本)。在这项任务中最重要的是速度,因此应该提供第一个结果,而其他所有结果都可以忽略。
我对绕过这些数据的惯用方式有疑问。当它退出时,有这个问题的一切都没有问题(所有较慢的 goroutine 都没有完成它们的工作,因为主进程存在)。但是当我们取消最后一行的注释(使用 Sleep)时,我们可以看到其他 goroutines 也在做他们的工作。
现在我正在通过通道推送数据有没有办法不推送它们?
处理此类问题的好方法是什么?
package main
import (
"fmt"
"log"
"math/rand"
"time"
)
type Result int
type Conn struct {
Id int
}
func (c *Conn) DoQuery(params string) Result {
log.Println("Querying start", params, c.Id)
time.Sleep(time.Duration(rand.Int31n(1000)) * time.Millisecond)
log.Println("Querying end", params, c.Id)
return Result(1000 + c.Id*c.Id)
}
func Query(conns []Conn, query string) Result {
ch := make(chan Result)
for _, conn := range conns {
go func(c Conn) {
ch <- c.DoQuery(query)
}(conn)
}
return <-ch
}
func main() {
conns := []Conn{Conn{1}, Conn{2}, Conn{3}, Conn{4}, Conn{5}}
result := Query(conns, "query!")
fmt.Println(result)
// time.Sleep(time.Minute)
}
千万里不及你
相关分类