- 此问题在此处已有答案**:
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连接池)时,是否有限制并行协程数量的最佳实践?
1条答案
按热度按时间l7wslrjt1#
由于您的
doingSomethingWithDB()
在开始/结束时手动获取和释放资源,在这种情况下限制并行度是不够的-我们需要限制并发度。最简单的方法是使用Semaphore:解释几句:因为协程可以挂起并在线程之间切换,所以即使我们限制调用
doingSomethingWithDB()
的协程的并行度,这个函数仍然可以被并发调用任意次。并行度只是指在特定时刻有多少协程可以主动执行,但是如果其中任何一个挂起,其他协程可以继续执行。