Kotlin:创建自定义 CoroutineContext

arg*_*g20 3 jdbc kotlin kotlinx.coroutines

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

完成此任务的最佳方法是什么(一般情况下以及针对我的特定用例)?我知道 Kotlin 提供了contexts开箱即用的功能,但是创建我自己的最佳方法是什么?

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

man*_*ono 6

该函数newFixedThreadPoolContext现在被认为在当前版本的 Kotlin 协程 (1.3.0) 中已过时,因为它现在带有注释@ObsoleteCoroutinesApi,如果您尝试使用,它会向您发出警告。文档还指出,它将在未来被替换。

现在创建 CoroutineContext 的推荐方法是通过

Executors.newFixedThreadPool(3).asCoroutineDispatcher()
Run Code Online (Sandbox Code Playgroud)

因此,带有导入的完整示例(还创建了 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)
}
Run Code Online (Sandbox Code Playgroud)


zsm*_*b13 5

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

val myContext = newFixedThreadPoolContext(nThreads = 3, name = "My JDBC context")
Run Code Online (Sandbox Code Playgroud)

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