我正在尝试处理数据对象树。每个树叶都应该通过使用协程的函数进行处理。整个过程应该使用固定大小的线程池来完成。
所以我想出了这个:
val node = an instance of WorkspaceEntry (tree structure)
val localDispatcher = newFixedThreadPoolContext(16)
fun main() {
val job = SupervisorJob()
val scope = CoroutineScope(localDispatcher + job)
handleEntry(node, scope)
runBlocking {
job.join()
}
}
handleEntry 方法在主管中为每个树叶递归地启动一个子作业。
主管的子作业全部成功完成,但连接永远不会返回。我理解错了吗?
编辑:HandleEntry 函数
private fun handleEntry(workspaceEntry: WorkspaceEntry, scope: CoroutineScope) {
if (workspaceEntry is FileEntry) {
scope.launch {
FileTypeRegistry.processFile(workspaceEntry.fileBlob)
}
} else {
workspaceEntry.children.forEach { child -> handleEntry(child, scope) }
}
}
最佳答案
看来Job
用于创建 CoroutineContext
(在您的情况下 SupervisorJob
)不用于等待子协程完成,因此您不能使用 job.join()
.我猜 Job
的主要意图是取消子协程。换 runBlocking
阻止以下内容将起作用:
runBlocking {
job.children.forEach {
it.join()
}
}
关于kotlin - 如何加入 Kotlin 主管工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53916377/