Я перевожу наше текущее приложение с Java на Kotlin, и я столкнулся с этой проблемой.
Реализация Java, используемая для использования потоков для передачи данных с сервера.
Это создаст около100 различных потоков, которые запрашивали бы данные, но из того, что я видел, работало не более 4, остальные ожидали завершения потока перед запуском.
При переводе в Kotlin я использовал Coroutines
Это создает проблему, потому что, по-видимому, сервер не может обработать фактически отправленные 100 запросов.
Все сопрограммы запускаются в одной и той же области, поэтому это выглядит примерно так:
//this is a custom scope that launches on Dispatchers.IO + a job that I can use to cancel everything
transferScope.launch {
//loadData is a suspending function that returns true/false
val futures = mDownloadJobs.map{ async { it.loadData() } }
val responses = futures.awaitAll()
//check that everything in responses is true etc....
}
Есть ли способ заставить конкретный TransferScope разрешать одновременно только до 5 сопрограмм, а затем, когда один заканчивает, запускать другой? (Меня не волнует порядок)
Если это невозможно сделать с помощью объема, есть ли другой способ добиться этого?