1 回答

TA貢獻1812條經驗 獲得超5個贊
為了限制嘗試次數,我們只需要計算所做的嘗試,這對于現有的for循環來說是微不足道的。
它出現在您打算使其可取消的頻道中,但此處的用法將無法按預期工作。您可以為此使用 a,稍后可以將其合并到接受上下文的其他調用中。否則,a 是等待完成的預期方法。stopcontext.Contextsync.WaitGroup
等待 goroutine 返回可以通過通道完成,但不應依賴于發送單個值。如示例中所示,多個讀取器(可能由于重構而稍后添加)將導致另一個讀取器無法接收信號。如果您確實使用頻道,則關閉頻道是廣播信號的規范方式。
使用這些信息,我們可以想出這個修改后的例子: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 關注
- 128 瀏覽
添加回答
舉報