channel死锁
package main import "fmt" func main() { ch := make(chan string) for i := 0; i < 10; i++ { s := <- ch fmt.Println(s) } go func(ch chan string) { for i := 0; i < 10; i++ { ch <- fmt.Sprintf("%d", i) } }(ch) }
报错
all goroutines are asleep - deadlock!
分析:无缓冲通道,只有接收端和发送端都准备好才会通过channel传输数据,所以main方法执行到
s := <- ch
这行代码会一直阻塞等待接收端准备好才能往下运行,而阻塞后接受端的代码就会一直运行不到,就会产生死锁。
解决
思路:先开启一个协程让运行接收端/发送端,main主协程继续往下执行。两个协程(接收断/发送端)都准备好后,就开始传输数据。
package main import "fmt" func main() { ch := make(chan string) go func(ch chan string) { for i := 0; i < 10; i++ { ch <- fmt.Sprintf("%d", i) } }(ch) for i := 0; i < 10; i++ { s := <- ch fmt.Println(s) }
标签:deadlock,接收端,chan,golang,死锁,ch,asleep,main
From: https://www.cnblogs.com/chenxiaomeng/p/18016763