限制可以在一个范围内运行的最大协程数

Cru*_*ces 5 android coroutine kotlin

我正在将我们当前的应用程序从 Java 翻译成 Kotlin,我遇到了这个问题。

java 实现用于使用线程从服务器传输数据。

它会创建大约 100 个不同的线程来请求数据,但从我看到的情况来看,一次运行的线程不超过 4 个,其他线程会在启动之前等待线程完成。

将其翻译成 Kotlin 时,我使用了协程

这会产生一个问题,因为显然服务器无法处理实际发送的 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....
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让特定的 transferScope 一次只允许最多 5 个协程,然后当一个协程完成时让另一个运行?(我不在乎顺序)

如果不能通过范围完成,是否有其他方法可以实现?

Ens*_*lic 15

要求每个协程Semaphore在发出请求之前从总共 5 个许可中获取一个 Kotlin许可。

像这样的东西:

    import kotlinx.coroutines.sync.Semaphore

    val requestSemaphore = Semaphore(5)

    val futures = mDownloadJobs.map {
        async {
            // Will limit number of concurrent requests to 5
            requestSemaphore.withPermit {
                it.loadData()
            }
        }
    }

    val responses = futures.awaitAll()
Run Code Online (Sandbox Code Playgroud)