晓之海绵宝宝
2018-06-27 14:44
package main
import (
"fmt"
)
func main() {
ch := make(chan string)
for i := 0; i < 5; i++ {
go printHello(i, ch)
}
for {
message := <-ch
fmt.Println(message)
}
}
func printHello(i int, ch chan string) {
message := fmt.Sprintf("groutine %d send u message", i)
fmt.Println(message)
ch <- message
}以上是我运行的代码,执行结果:
fatal error: all goroutines are asleep - deadlock! groutine 4 send u message groutine 4 send u message goroutine 1 [chan receive]: groutine 1 send u message main.main() groutine 1 send u message groutine 0 send u message /Users/donng/go/src/practice/cmd/hello-world/main.go:14 +0x9e groutine 2 send u message
经过测试找到问题了,原文中用
for {
message := <-ch
fmt.Println(message)
}这种写法,在 for 循环到最后, ch 没有数据时,程序死锁。
我将接收部分修改为以下,就可以了,不过很奇怪为什么老师的 5000 个,没有出现死锁。
go func(ch chan string) {
for {
message := <-ch
fmt.Println(message)
}
}(ch)搭建并行处理管道,感受GO语言魅力
19444 学习 · 81 问题
相似问题