you_are_enot
@you_are_enot
Пограммист любитель

Как ограничить отправку запросов из горутин?

Я запускаю пачку горутин внутри которых происходит несколько запросов к API. Проблема в том, что эти запросы нельзя отправлять чаще, чем раз в 50 мс.
С помощью чего можно контролировать частоту запросов в горутинах?

// main
for _, url := range urls {
      go getUsersData(url, in)
}

// gorutine
func getUsersData(url string, in chan ResultData) {
      res1, err := request1
      // ....
      res2, err := request2
}
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov
Senior software developer, system architect
import "time"

rate := time.Second / 10
throttle := time.Tick(rate)
for req := range requests {
  <-throttle  // rate limit our Service.Method RPCs
  go client.Call("Service.Method", req, ...)
}

Более реальный пример
import "time"

rate := time.Second / 10
burstLimit := 100
tick := time.NewTicker(rate)
defer tick.Stop()
throttle := make(chan time.Time, burstLimit)
go func() {
  for t := range tick.C {
    select {
      case throttle <- t:
      default:
    }
  }  // does not exit after tick.Stop()
}()
for req := range requests {
  <-throttle  // rate limit our Service.Method RPCs
  go client.Call("Service.Method", req, ...)
}


Пример взял тут
https://github.com/golang/go/wiki/RateLimiting
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы