为什么以下代码示例在一些迭代后被卡住了?

时间:2016-04-24 17:35:14

标签: go

我正在尝试学习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 {
    }
}

如何调查的基本开始就足够了。

2 个答案:

答案 0 :(得分:2)

主goroutine(运行for {}循环)正在占用线程,并且没有其他goroutine能够执行因为它。如果您将main功能的结尾更改为:

for {
    runtime.Gosched()
}

然后线程将被释放,另一个goroutine被激活。

  

func Gosched()

     

Gosched产生处理器,允许其他goroutines运行。它不会挂起当前的goroutine,因此执行会自动恢复。

- https://golang.org/pkg/runtime/#Gosched

答案 1 :(得分:0)

未定义goroutings的执行顺序。代码卡住是合法的。与main()进行沟通时,您可以更加确定。例如地方

for {
   deliveryChann <- true
   log.Println("Sent")
}

in main()代替go func()