当前位置: > > > > 致命错误:所有 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的技术知识我们会一点点深入介绍,欢迎大家关注公众号,一起学习编程~