kotlin 协程数量限制[重复]

yhxst69z  于 2023-01-05  发布在  Kotlin
关注(0)|答案(1)|浏览(271)
    • 此问题在此处已有答案**:

how to cap kotlin coroutines maximum concurrency(7个答案)
2天前关闭。
我有代码,大概是这样的:

entities.forEach {
    launch() {
        doingSomethingWithDB(it)
    }
}

suspend fun doingSomethingWithDB(entity) {
    getDBConnectionFromPool()
    // doing something
    returnDBConnectionToPool()
}

当实体的数量超过DB连接池的大小时(我使用HikariCP),我会得到错误-Connection is not available...。即使我只使用单个线程(例如-Dkotlinx.coroutines.io.parallelism=1),我也会得到这个错误。
在处理外部资源(如固定大小的DB连接池)时,是否有限制并行协程数量的最佳实践?

l7wslrjt

l7wslrjt1#

由于您的doingSomethingWithDB()在开始/结束时手动获取和释放资源,在这种情况下限制并行度是不够的-我们需要限制并发度。最简单的方法是使用Semaphore

val semaphore = Semaphore(8)

suspend fun doingSomethingWithDB(entity) {
    semaphore.withPermit {
        getDBConnectionFromPool()
        // doing something
        returnDBConnectionToPool()
    }
}

解释几句:因为协程可以挂起并在线程之间切换,所以即使我们限制调用doingSomethingWithDB()的协程的并行度,这个函数仍然可以被并发调用任意次。并行度只是指在特定时刻有多少协程可以主动执行,但是如果其中任何一个挂起,其他协程可以继续执行。

相关问题