1 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
為了限制嘗試次數(shù),我們只需要計(jì)算所做的嘗試,這對(duì)于現(xiàn)有的for循環(huán)來說是微不足道的。
它出現(xiàn)在您打算使其可取消的頻道中,但此處的用法將無法按預(yù)期工作。您可以為此使用 a,稍后可以將其合并到接受上下文的其他調(diào)用中。否則,a 是等待完成的預(yù)期方法。stopcontext.Contextsync.WaitGroup
等待 goroutine 返回可以通過通道完成,但不應(yīng)依賴于發(fā)送單個(gè)值。如示例中所示,多個(gè)讀取器(可能由于重構(gòu)而稍后添加)將導(dǎo)致另一個(gè)讀取器無法接收信號(hào)。如果您確實(shí)使用頻道,則關(guān)閉頻道是廣播信號(hào)的規(guī)范方式。
使用這些信息,我們可以想出這個(gè)修改后的例子:https://play.golang.org/p/hZiRXtMm-SB
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
maxAttempts := 5
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
ticker := time.NewTicker(1000 * time.Millisecond)
call(1)
for i := 1; ; i++ {
if i >= maxAttempts {
fmt.Println("too many tries")
return
}
select {
case <-ctx.Done():
fmt.Println("cancelled")
return
case <-ticker.C:
randInt := get()
call(randInt)
if randInt == 11 {
fmt.Println("OK")
return
}
}
}
}()
wg.Wait()
- 1 回答
- 0 關(guān)注
- 125 瀏覽
添加回答
舉報(bào)