简短要求:能够创建协程上下文,该上下文将仅在单线程中执行(例如,没有并行性)。
附加要求:这些任务最好使用现有的 CommonPool(例如 Thread Pool)
实际上,kotlin 协程有方法 newSingleThreadContext
,它将创建单独的线程并将所有任务调度到其中。但是,这是专用线程,因此约 1000 个这样的上下文将需要大量资源。
因此,我希望上下文具有以下特征:
- 最多可同时执行一个任务
- 此上下文应重用任何其他上下文(例如父上下文)。例如上下文不应包含额外的线程
最佳答案
从1.6.0
开始我们可以使用的 kotlinx.coroutines
库的版本 limitedParallelism
CoroutineDispatcher
上的函数对象,它允许您在不创建额外线程池的情况下限制并行度,并提供一种统一的方法来创建非绑定(bind)并行度的调度程序。
使用示例:
class UserRepository {
private val dbDispatcher = Dispatchers.IO.limitedParallelism(1)
suspend fun getUserById(userId: Int): User? = withContext(dbDispatcher) {
executeQuery("SELECT * FROM users WHERE id = $1", userId).singleOrNull()
}
}
limitedParallelism(1)
保证并行限制 - 最多 1 个协程可以在此调度程序中并发执行。
应该可以解决问题:
Maximum one task can be executed at the same time.
关于java - 如何在 Kotlin 的公共(public)池下创建单线程协程上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50355071/