1 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
我的建議是,使CH緩沖通道,每個(gè)查詢一個(gè)空間:ch := make(chan Result, len(conns))。這樣每個(gè)查詢都可以運(yùn)行完成,并且不會(huì)阻塞通道寫(xiě)入。
Query可以讀取一次并返回第一個(gè)結(jié)果。當(dāng)所有其他 goroutine 完成時(shí),通道最終將被垃圾回收,一切都會(huì)消失。使用無(wú)緩沖通道,您可以創(chuàng)建許多永遠(yuǎn)不會(huì)終止的 goroutine。
編輯:如果你想取消飛行中的請(qǐng)求,它會(huì)變得更加困難。某些操作和 API 提供取消功能,而其他操作和 API 則不提供。對(duì)于 http 請(qǐng)求,您可以Cancel在請(qǐng)求結(jié)構(gòu)上使用字段。只需提供一個(gè)您可以關(guān)閉以取消的頻道:
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
}
如果有一個(gè)您不關(guān)心的大型讀取請(qǐng)求,這可能會(huì)有所幫助,但它實(shí)際上可能會(huì)或可能不會(huì)取消遠(yuǎn)程服務(wù)器上的請(qǐng)求。如果您的查詢不是 http,而是數(shù)據(jù)庫(kù)調(diào)用或其他什么,您將需要查看是否有類(lèi)似的取消機(jī)制可以使用。
- 1 回答
- 0 關(guān)注
- 214 瀏覽
添加回答
舉報(bào)