如何同時從速率受限的 API 端點進行提?。?/h1>
1 回答

TA貢獻1820條經驗 獲得超10個贊
我真的不明白為什么你的被處在一個單獨的goroutine中。我認為每個工作進程都應該在執行任務之前退縮(如果需要的話)。我看到它是這樣的:backOffProcess
backOffUntil := time.Now()
backOffMutex := sync.Mutex{}
go func() {
defer wg.Done()
for s := range jobC {
<-time.After(time.Until(backOffUntil))
limiter.Wait(ctx)
res, err := doSomeRequest(s)
if err != nil {
// Handle error.
log.Println(err)
}
// Handle rate limit.
if res.StatusCode == 429 {
delay, _ := strconv.Atoi(res.Header.Get("Retry-After"))
log.Println("rate limit hit, backing off")
// Back off.
newbackOffUntil := time.Now().Add(time.Second * delay)
backOffMutex.Lock()
if newbackOffUntil.Unix() > backOffUntil.Unix() {
backOffUntil = newbackOffUntil
}
backOffMutex.Unlock()
// Put serial back into job queue.
jobC <- s
}
resultC <- res
}
}()
- 1 回答
- 0 關注
- 125 瀏覽
添加回答
舉報