1 回答

TA貢獻1784條經驗 獲得超9個贊
我的建議是,使CH緩沖通道,每個查詢一個空間:ch := make(chan Result, len(conns))。這樣每個查詢都可以運行完成,并且不會阻塞通道寫入。
Query可以讀取一次并返回第一個結果。當所有其他 goroutine 完成時,通道最終將被垃圾回收,一切都會消失。使用無緩沖通道,您可以創建許多永遠不會終止的 goroutine。
編輯:如果你想取消飛行中的請求,它會變得更加困難。某些操作和 API 提供取消功能,而其他操作和 API 則不提供。對于 http 請求,您可以Cancel在請求結構上使用字段。只需提供一個您可以關閉以取消的頻道:
func (c *Conn) DoQuery(params string, cancel chan struct{}) Result {
//error handling omitted. It is important to handle errors properly.
req, _ := http.NewRequest(...)
req.Cancel = cancel
resp, _ := http.DefaultClient.Do(req)
//On Cancellation, the request will return an error of some kind.
return readData(resp)
}
func Query(conns []Conn, query string) Result {
ch := make(chan Result)
cancel := make(chan struct{})
for _, conn := range conns {
go func(c Conn) {
ch <- c.DoQuery(query,cancel)
}(conn)
}
first := <-ch
close(cancel)
return first
}
如果有一個您不關心的大型讀取請求,這可能會有所幫助,但它實際上可能會或可能不會取消遠程服務器上的請求。如果您的查詢不是 http,而是數據庫調用或其他什么,您將需要查看是否有類似的取消機制可以使用。
- 1 回答
- 0 關注
- 215 瀏覽
添加回答
舉報