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

每次它从一个节点移动到下一个节点时,它会将上一个节点的属性传播到下一个节点,依此类推,以模拟节点彼此之间的效果。
有时,一个节点可能连接到多个节点。
在我目前的实现中,算法在完成树的其余部分之前,会沿着每条拆分的路径一直走到最后:

这是次优的,因为所有其他分支都必须等待算法完成,这是大量时间的浪费,特别是当树非常大的时候。
理想情况下,我希望每个拆分都会产生一个新的线程,这样所有的路由都会被并行地探索。
我目前是Kotlin协程的新手,所以如果这看起来很愚蠢,请容忍我。
目前,我正在考虑使用Kotlin的协程(注意:这是近似代码)以如下方式实现:
suspend fun propagate(startFromNode: Node) {
coroutineScope {
while (true) {
//Do propagation
if (split) {
launch {
propagate(splitNode)
}
}
if (atEndOfPath) {
break
}
}
}
}我不确定Kotlin如何处理协程也可以产生新协程的情况。
如果一个协程因为某种原因抛出了异常,那么源自这个主协程作用域的所有其他协程会被取消吗,包括已经由其他协程启动的协程?
此外,如果可能的话,我希望使用递归函数来实现这一点,但似乎没有一种简单的方法可以使用协程来实现这一点。
谢谢。
发布于 2019-10-03 03:23:06
如果阅读结构化并发,您可以找到有关这方面的更多详细信息。而是回答你眼前的问题。
你的实现看起来就像我自己写的一样(可能大多数人也是这样)。递归似乎是这里的一种方式,正如你已经做过的那样。
是!每次对propagate的调用都会等待它的子协程完成后才会返回,所以当子进程中的一个抛出异常时,父进程和兄弟进程都会被取消(异常)。然后,coroutineScope会抛出异常,这基本上会取消整个协程堆栈。
https://stackoverflow.com/questions/58207305
复制相似问题