Kotlin-带循环的协程

Kotlin-带循环的协程,kotlin,tree,kotlin-coroutines,Kotlin,Tree,Kotlin Coroutines,因此,我有一个简单的算法,以这种方式遵循树结构: 每次从一个节点移动到下一个节点时,它都会将上一个节点的属性传播到下一个节点,以此类推,以模拟节点之间的相互影响 有时一个节点可以连接到多个节点 在我当前的实现中,算法在完成树的其余部分之前,沿着每个分割路径一直到最后: 这是次优的,因为所有其他分支都必须等待算法完成,这浪费了大量时间,尤其是当树非常大时 理想情况下,我希望每次拆分都产生一个新线程,以便并行地探索所有路由 我目前还不熟悉Kotlin的合作项目,所以如果这看起来很愚蠢,请容忍我

因此,我有一个简单的算法,以这种方式遵循树结构:

每次从一个节点移动到下一个节点时,它都会将上一个节点的属性传播到下一个节点,以此类推,以模拟节点之间的相互影响

有时一个节点可以连接到多个节点

在我当前的实现中,算法在完成树的其余部分之前,沿着每个分割路径一直到最后:

这是次优的,因为所有其他分支都必须等待算法完成,这浪费了大量时间,尤其是当树非常大时

理想情况下,我希望每次拆分都产生一个新线程,以便并行地探索所有路由

我目前还不熟悉Kotlin的合作项目,所以如果这看起来很愚蠢,请容忍我

目前,我正在考虑使用Kotlin的协程(注:这是近似代码)以以下方式实现此功能:

我不确定Kotlin如何处理协同程序也会产生新的协同程序的情况

如果一个协程因某种原因引发异常,那么是否会取消源自此主协程作用域的所有其他协程,包括已由其他协程启动的协程

此外,如果可能的话,我想使用递归函数来实现这一点,但似乎没有一种简单的方法可以通过协同程序来实现


谢谢。

如果阅读有关结构化并发的内容,您可以了解更多详细信息。 但要回答你眼前的问题

您的实现看起来就像我自己(可能还有大多数人)编写的那样。递归似乎是实现这一点的方法,并且是可能的,因为您已经这样做了


对!!对
propagate
的每次调用都将等待其子协同路由完成后再返回,因此当其中一个子进程抛出异常时,父进程和同级进程将被取消(异常情况)
coroutineScope
将抛出异常,该异常通常会取消整个coroutine堆栈。

您阅读过关于coroutines的文档吗?如果没有,最好从这个开始,然后问更具体的问题。简而言之,协程继承作用域,如果其中一个失败,则会取消协程作用域中的所有协程。好的,谢谢!此外,您认为使用递归函数可以做到这一点吗?一个while-true循环有点难看。你应该能够递归地完成这项工作,但是如果没有自包含的示例,我就不能向你展示。好的,剩下的我自己来解决
suspend fun propagate(startFromNode: Node) {
   coroutineScope {
      while (true) {
        //Do propagation
        if (split) {
           launch {
              propagate(splitNode)
           }
        }
        if (atEndOfPath) {
           break
        }
      }
   }
}