Я пытаюсь обработать дерево объектов данных.Предполагается, что каждый лист дерева обрабатывается с помощью сопрограммы.Весь процесс должен выполняться с использованием пула потоков фиксированного размера.
Итак, я пришел к следующему:
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) }
}
}