首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带循环的Kotlin - Coroutines

带循环的Kotlin - Coroutines
EN

Stack Overflow用户
提问于 2019-10-03 02:26:13
回答 1查看 3.7K关注 0票数 3

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

每次它从一个节点移动到下一个节点时,它会将上一个节点的属性传播到下一个节点,依此类推,以模拟节点彼此之间的效果。

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

在我目前的实现中,算法在完成树的其余部分之前,会沿着每条拆分的路径一直走到最后:

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

理想情况下,我希望每个拆分都会产生一个新的线程,这样所有的路由都会被并行地探索。

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

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

代码语言:javascript
复制
suspend fun propagate(startFromNode: Node) {
   coroutineScope {
      while (true) {
        //Do propagation
        if (split) {
           launch {
              propagate(splitNode)
           }
        }
        if (atEndOfPath) {
           break
        }
      }
   }
}

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

如果一个协程因为某种原因抛出了异常,那么源自这个主协程作用域的所有其他协程会被取消吗,包括已经由其他协程启动的协程?

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-03 03:23:06

如果阅读结构化并发,您可以找到有关这方面的更多详细信息。而是回答你眼前的问题。

你的实现看起来就像我自己写的一样(可能大多数人也是这样)。递归似乎是这里的一种方式,正如你已经做过的那样。

是!每次对propagate的调用都会等待它的子协程完成后才会返回,所以当子进程中的一个抛出异常时,父进程和兄弟进程都会被取消(异常)。然后,coroutineScope会抛出异常,这基本上会取消整个协程堆栈。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58207305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档