登录
首页 >  Golang >  Go问答

递归死锁中的Goroutines

来源:stackoverflow

时间:2024-02-08 17:57:22 220浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《递归死锁中的Goroutines》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

我有一个 dfs 递归函数,它为我提供了有向图中所有可能的路线。 而且我无法准确知道它何时结束。

func dfs(data map[int][]int, path []int) {
    datum := path[len(path)-1]
    value := data[datum]
    for i := 0; i < len(value); i++ {
        if !contains(path, value[i]) {
            new_path := append(path, []int{value[i]}...)
            if len(new_path) > len(max_path) {
                max_path = new_path
            }
            dfs(data, new_path)
        }
    }
}

我尝试在不同情况下在 goroutine 上执行此函数。为了减少时间,我使用 goroutine。 (顺便说一句,它确实可以将速度提高 10 倍或更多)

for _, node := range nodes {
        if is_touching_wall(node) {
            wg.Add(1)
            go dfs(graph, []int{node})
        }
    }

    wg.Wait()

正如您在这里所理解的,我调用了 wg.add(1),但稍后我不再调用 wg.done()。因此它会产生“致命错误:所有 goroutine 都在睡觉 - 死锁!”。

我试图找到 dfs 完成的时间,以便调用 done() 但无法管理它。

如果 goroutine 陷入僵局,是否有其他方法可以取消它们,或者我应该在这里尝试另一种方法?


正确答案


按照这种方法使用 goroutine 的方式,您不太可能获得太多收益(如果有的话)。如果 dfs 在树上运行,那么您可以将其拆分为不相交的部分,并在每个部分上使用 goroutine。使用有向图,您不知道一个 goroutine 遍历的节点是否也被其他 goroutine 遍历。

尽管如此,为了处理死锁,你必须在 goroutine 结束时调用 wg.done 。一个简单的方法是:

wg.Add(1)
go func() {
   defer wg.Done()
   dfs(graph, []int{node})
}()

但这并不能解决你真正的问题,只能解决死锁。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《递归死锁中的Goroutines》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>