Kotlin-带循环的协程

时间:2019-10-02 18:26:12

标签: kotlin tree kotlin-coroutines

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

Simple tree

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

有时一个节点可能连接到多个节点。

在我当前的实现中,算法会在完成树的其余部分之前遵循每个拆分路径的末尾:

Split tree

这是次优的,因为所有其他分支都必须等待算法完成,这会浪费很多时间,尤其是在树很大的情况下。

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

我目前不是Kotlin协程的新手,所以如果这看起来很愚蠢,请多包涵。

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

suspend fun propagate(startFromNode: Node) {
   coroutineScope {
      while (true) {
        //Do propagation
        if (split) {
           launch {
              propagate(splitNode)
           }
        }
        if (atEndOfPath) {
           break
        }
      }
   }
}

我不确定Kotlin如何处理协程还可以产生新协程的情况。

如果一个协程由于某种原因引发异常,是否会取消所有源自此主要协程范围的其他协程,包括由其他协程启动的协程?

此外,如果可能的话,我想使用递归函数来实现这一点,但是似乎没有一种简单的方法可以对协程进行操作。

谢谢。

1 个答案:

答案 0 :(得分:1)

如果阅读有关结构化并发的信息,则可以找到有关此信息的更多详细信息。 但是要回答您的直接问题。

您的实现看起来就像我自己(可能是大多数人)所写的那样。递归似乎是解决问题的方法,并且在您完成之后也是可能的。

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