1

我在我的 API 后端使用 Kotlin。我不想在common pool. 基本上,我想创建一个CoroutineContext具有多个与数据库匹配的线程maximumPoolSize

完成此任务的最佳方法是什么(通常以及针对我的特定用例)?我知道 Kotlincontexts开箱即用,但创建自己的最佳方法是什么?

额外问题:如果我的 jdbc 连接池大小为 3,那么使用线程池大小为 3 的协程上下文是否有意义?这能保证最好的并发性吗?

4

2 回答 2

4

您可以使用以下方法创建CoroutineContext由具有固定数量线程的线程池支持的newFixedThreadPoolContext

val myContext = newFixedThreadPoolContext(nThreads = 3, name = "My JDBC context")

是的,将线程池的大小与连接池的大小相匹配似乎是个好主意,因为这样你的线程(假设它们一次使用一个连接)将始终为它们准备好数据库连接 -这是一个博客帖子建议相同。

于 2018-06-15T04:09:05.203 回答
4

该函数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)
}
于 2019-09-17T20:26:55.167 回答