algorithm之程序正在等待 goroutines 完成,但 goroutines 被死锁

bjzhanghao 阅读:88 2025-06-02 22:19:02 评论:0

这个问题在这里已经有了答案:





Go all goroutines are asleep deadlock

(2 个回答)



fatal error: all goroutines are asleep - deadlock! when channel is not buffered

(1 个回答)



Why do we need to run unbuffered channels in go routine but buffered channels can work without go routine?

(2 个回答)



Golang Goroutine Error "all goroutines are asleep - deadlock!"

(1 个回答)



golang all goroutines are asleep - deadlock

(3 个回答)


1年前关闭。




谁知道为什么fatal error: all goroutines are asleep - deadlock!发生在这里?我想生成 5 个 goroutine 并将每个 goroutine 中的错误发送到一个 channel ,然后等待所有这些 go 例程完成,然后再生成更多 goroutine 发送到 channel 。

package main 
 
import ( 
    "errors" 
    "fmt" 
    "sync" 
) 
 
func main() { 
    var wg sync.WaitGroup 
    ch := make(chan error) 
    var allErrors []error 
 
    wg.Add(5) 
    for i := 0; i < 5; i++ { 
        go func() { 
            defer wg.Done() 
 
            ch <- errors.New("lalalla") 
        }() 
    } 
    wg.Wait() 
 
    wg.Add(2) 
     
    go func() { 
        defer wg.Done() 
        ch <- errors.New("some error") 
    }() 
 
    go func() { 
        defer wg.Done() 
        ch <- errors.New("other error") 
    }() 
 
    go func() { 
        wg.Wait() 
        close(ch) 
    }() 
 
    go func() { 
        for e := range ch { 
            allErrors = append(allErrors, e) 
        } 
    }() 
 
    wg.Wait() 
 
    fmt.Println(allErrors) 
 
} 
https://play.golang.org/p/LhjBaTgLDn6

请您参考如下方法:

第一个wg.Wait等待 goroutine 完成,但没有从该 channel 读取任何内容,因此所有 goroutine 都被阻塞等待写入 channel 。
在等待 goroutine 之前启动从 channel 读取的 goroutine。


标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号