如何正确处理/关闭Kotlin中的自定义协同程序调度程序?
考虑这段代码:如何正确处理/关闭Kotlin中的自定义协同程序调度程序?,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,考虑这段代码: val coroutineDispatcher = Executors.newFixedThreadPool(8).asCoroutineDispatcher() fun main() = runBlocking { launch(coroutineDispatcher) { println("'launch' finished execution") } println("This will be printed, but 'ru
val coroutineDispatcher = Executors.newFixedThreadPool(8).asCoroutineDispatcher()
fun main() = runBlocking {
launch(coroutineDispatcher) { println("'launch' finished execution") }
println("This will be printed, but 'runBlocking' will never exit")
}
main()
函数将永远不会退出,程序将永远挂起。但是,如果我使用任何标准调度程序,例如Default
、IO
等,程序将在runBlocking
和launch
返回后结束。如果调用coroutineDispatcher.close()
,程序也将按预期退出
我的问题是:
如果客户端代码无权访问该调度器,那么关闭该调度器的正确方法是什么?假设我在客户端代码中公开了以下函数:
private val coroutineDispatcher = Executors.newFixedThreadPool(8).asCoroutineDispatcher()
suspend fun doStuff(block: () -> Unit) {
withContext(coroutineDispatcher) {
block()
}
}
如何确保客户端代码完成后程序成功退出?特别是当
doStuff()
应该被多次调用时。您可以向客户端公开dispose/clear
函数,这只需取消/关闭您的协同路由范围您可以向客户端公开dispose/clear
函数,这只会取消/关闭您的协同程序范围,但会将管理资源的负担放到客户机上,这是我想要避免的。另外,没有一个默认的分派器必须关闭,所以我想有一个不同的wayWell,然后你可以依赖一个抽象。但我认为,你必须以某种方式向回购发出信号,表明你的消费者不再是有效的,但这会把管理资源的负担推到客户身上,这是我希望避免的。另外,没有一个默认的分派器必须关闭,所以我想有一个不同的wayWell,然后你可以依赖一个抽象。但我认为,你必须以某种方式向回购发出信号,表明你的消费者已不复存在