這是來自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}據(jù)了解,這意味著我們使用通道done提前中斷工作人員而不等待完全執(zhí)行(在我們的案例中執(zhí)行replicas[i](query)。因此,我們可以從最快的工作人員(“First Wins Pattern”)收到結(jié)果,然后取消所有其他工人的工作并節(jié)省資源。另一方面,根據(jù)規(guī)范:對(duì)于語(yǔ)句中的所有情況,接收操作的通道操作數(shù)以及發(fā)送語(yǔ)句的通道和右側(cè)表達(dá)式在輸入“select”語(yǔ)句時(shí)按源順序恰好計(jì)算一次。據(jù)我了解,這意味著我們不能interrupt the workers,因?yàn)樵谌魏吻闆r下,所有工作人員都會(huì)評(píng)估功能replicas[i]query,然后才選擇case <- done并完成他們的執(zhí)行。能否請(qǐng)您指出我推理中的錯(cuò)誤?
1 回答

慕桂英3389331
TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
您的推理是正確的,網(wǎng)站上的措辭并不完全清楚。這個(gè)“構(gòu)造”實(shí)現(xiàn)的是 goroutines 不會(huì)永遠(yuǎn)掛起,但是一旦搜索完成,goroutines 就會(huì)正確結(jié)束。那里什么也沒有發(fā)生。
通常,您不能從外部中斷任何 goroutine,goroutine 本身必須支持某種終止(例如關(guān)閉通道context.Context
等)。
所以是的,在您發(fā)布的示例中,將同時(shí)啟動(dòng)所有搜索,最快的搜索結(jié)果將在到達(dá)時(shí)返回,只要搜索完成,其余的 goroutine 將繼續(xù)運(yùn)行。
剩下的怎么辦?其余的將被丟棄(case <- done
將被選中,因?yàn)闊o緩沖的通道不能容納任何元素,并且不會(huì)有其他人從該通道接收更多)。
- 1 回答
- 0 關(guān)注
- 116 瀏覽
添加回答
舉報(bào)
0/150
提交
取消