当前位置: > > > > 致命错误:所有 goroutine 都在睡觉 – 死锁!协程 1 :
致命错误:所有 goroutine 都在睡觉 – 死锁!协程 1 :
来源:stackoverflow
2024-04-21 21:18:39
0浏览
收藏
米云今天将给大家带来《致命错误:所有 goroutine 都在睡觉 – 死锁!协程 1 :》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!
问题内容
我正在运行 goroutine 及其通道,但仍然出现错误
package main
import (
"fmt"
"sync"
"time"
)
func foo(c chan int, wg *sync.WaitGroup) {
c <- 45
time.Sleep(time.Second * 4)
c <- 122
wg.Done()
}
func main() {
canal := make(chan int)
var wg sync.WaitGroup
wg.Add(2)
go foo(canal,&wg)
go foo(canal,&wg)
wg.Wait()
for a := range canal {
fmt.Println(a)
}
}
解决方案
make(chan int) 创建一个 。这意味着所有发送和接收操作员都会等待,直到另一方准备好。
当你在 Goroutine 中调用 c <- 45 时,该 Goroutine 将等待,直到有人从通道接收数据。但是,直到 range canal 语句卡在 wg.Wait() 后面之前,不存在任何消费者。
因此,您的两个 goroutine 被困在发送到通道的过程中,而 main 正在等待 goroutine 完成,然后再从通道消费。
您可以在单独的 goroutine 中使用通道中的元素(在 wg.Wait() 之前),或者创建一个缓冲通道(例如:make(chan int, 10)。
今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注米云公众号,一起学习编程~
