我正在尝试学习golang,我得到了一段代码,我不明白为什么它会在一段时间后卡住。
package main
import "log"
func main() {
deliveryChann := make(chan bool, 10000)
go func() {
for {
deliveryChann <- true
log.Println("Sent")
}
}()
go func() {
for {
select {
case <-deliveryChann:
log.Println("received")
}
}
}()
go func() {
for {
select {
case <-deliveryChann:
log.Println("received")
}
}
}()
go func() {
for {
select {
case <-deliveryChann:
log.Println("received")
}
}
}()
for {
}
}
如何调查的基本开始就足够了。
答案 0 :(得分:2)
主goroutine(运行for {}
循环)正在占用线程,并且没有其他goroutine能够执行因为它。如果您将main
功能的结尾更改为:
for {
runtime.Gosched()
}
然后线程将被释放,另一个goroutine被激活。
func Gosched()
Gosched产生处理器,允许其他goroutines运行。它不会挂起当前的goroutine,因此执行会自动恢复。
答案 1 :(得分:0)
未定义goroutings的执行顺序。代码卡住是合法的。与main()
进行沟通时,您可以更加确定。例如地方
for {
deliveryChann <- true
log.Println("Sent")
}
in main()
代替go func()