因此,我有一个简单的算法,该算法以这种方式遵循树形结构:
每次从一个节点移动到下一个节点时,它都会将前一个节点的属性传播到下一个节点,依此类推,以模拟节点之间的相互影响。
有时一个节点可能连接到多个节点。
在我当前的实现中,算法会在完成树的其余部分之前遵循每个拆分路径的末尾:
这是次优的,因为所有其他分支都必须等待算法完成,这会浪费很多时间,尤其是在树很大的情况下。
理想情况下,我希望每个拆分都产生一个新线程,以便并行浏览所有路由。
我目前不是Kotlin协程的新手,所以如果这看起来很愚蠢,请多包涵。
目前,我正在考虑使用Kotlin的协程以以下方式实现此目的(注意:这是近似代码):
suspend fun propagate(startFromNode: Node) {
coroutineScope {
while (true) {
//Do propagation
if (split) {
launch {
propagate(splitNode)
}
}
if (atEndOfPath) {
break
}
}
}
}
我不确定Kotlin如何处理协程还可以产生新协程的情况。
如果一个协程由于某种原因引发异常,是否会取消所有源自此主要协程范围的其他协程,包括由其他协程启动的协程?
此外,如果可能的话,我想使用递归函数来实现这一点,但是似乎没有一种简单的方法可以对协程进行操作。
谢谢。
答案 0 :(得分:1)
如果阅读有关结构化并发的信息,则可以找到有关此信息的更多详细信息。 但是要回答您的直接问题。
您的实现看起来就像我自己(可能是大多数人)所写的那样。递归似乎是解决问题的方法,并且在您完成之后也是可能的。
是的!每次对propagate
的调用都将等待子协程完成后再返回,因此,当其中一个子进程抛出异常时,父级和同级对象将被取消(例外)。 coroutineScope
然后将引发异常,该异常通常会取消整个协程堆栈。