Итак, допустим, у меня запущено несколько процедур, которые взаимодействуют с каким-то веб-сервисом, и, поскольку я не хочу спамить его, я хочу ограничить количество запросов до 1 запроса каждые х секунд максимум.Для этого я мог бы использовать некоторый код, подобный следующему:
fun CoroutineScope.rateLimiter(tokens: SendChannel<Unit>, rate: Int) = launch {
var lastToken = System.currentTimeMillis()
while (isActive) {
val currentTime = System.currentTimeMillis()
if (currentTime - lastToken < rate) {
delay(currentTime - lastToken)
}
tokens.send(Unit)
}
}
fun CoroutineScope.request(tokens: ReceiveChannel<Unit>) = launch {
for (token in tokens) {
//Do Web request
}
}
1.) Это эффективный способ сделать это?
2.) Это невозможно расширить, чтобы ограничить что-либо значением xбайт / секунду или что-то еще, где мне нужно было бы запросить x токенов из Token Bucket , что было бы лучшим способом реализовать что-то подобное с сопрограммами?