Как эффективно реализовать ограничение скорости для нескольких сопрограмм? - PullRequest
0 голосов
/ 25 октября 2018

Итак, допустим, у меня запущено несколько процедур, которые взаимодействуют с каким-то веб-сервисом, и, поскольку я не хочу спамить его, я хочу ограничить количество запросов до 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 , что было бы лучшим способом реализовать что-то подобное с сопрограммами?

...