我在我的 API 后端使用 Kotlin。我不想在common pool
. 基本上,我想创建一个CoroutineContext
具有多个与数据库匹配的线程maximumPoolSize
。
完成此任务的最佳方法是什么(通常以及针对我的特定用例)?我知道 Kotlincontexts
开箱即用,但创建自己的最佳方法是什么?
额外问题:如果我的 jdbc 连接池大小为 3,那么使用线程池大小为 3 的协程上下文是否有意义?这能保证最好的并发性吗?
我在我的 API 后端使用 Kotlin。我不想在common pool
. 基本上,我想创建一个CoroutineContext
具有多个与数据库匹配的线程maximumPoolSize
。
完成此任务的最佳方法是什么(通常以及针对我的特定用例)?我知道 Kotlincontexts
开箱即用,但创建自己的最佳方法是什么?
额外问题:如果我的 jdbc 连接池大小为 3,那么使用线程池大小为 3 的协程上下文是否有意义?这能保证最好的并发性吗?
您可以使用以下方法创建CoroutineContext
由具有固定数量线程的线程池支持的newFixedThreadPoolContext
:
val myContext = newFixedThreadPoolContext(nThreads = 3, name = "My JDBC context")
是的,将线程池的大小与连接池的大小相匹配似乎是个好主意,因为这样你的线程(假设它们一次使用一个连接)将始终为它们准备好数据库连接 -这是一个博客帖子建议相同。
该函数newFixedThreadPoolContext
现在被认为在当前版本的 Kotlin 协程 (1.3.0) 中已过时,因为它现在带有注释,@ObsoleteCoroutinesApi
如果您尝试使用它会向您发出警告。该文档还指出它将在将来被替换。
现在推荐的创建 CoroutineContext 的方法是通过
Executors.newFixedThreadPool(3).asCoroutineDispatcher()
所以一个完整的导入示例,其中还创建了一个 CoroutineScope,看起来像这样
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.asCoroutineDispatcher
import java.util.concurrent.Executors
import kotlin.coroutines.CoroutineContext
fun coroutineScope(threads: Int): CoroutineScope {
val context: CoroutineContext = Executors.newFixedThreadPool(threads).asCoroutineDispatcher()
return CoroutineScope(context)
}