Go 为什么下面的代码示例在经过一些迭代后仍然存在?

Go 为什么下面的代码示例在经过一些迭代后仍然存在?,go,Go,我正在努力学习golang,我得到了一段代码,我不明白为什么过了一段时间后它会卡住 package main import "log" func main() { deliveryChann := make(chan bool, 10000) go func() { for { deliveryChann <- true log.Println("Sent") } }()

我正在努力学习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 {
    }
}
主程序包
导入“日志”
func main(){
交货通道:=制造(chan bool,10000)
go func(){
为了{
deliveryChann主goroutine(为{}
循环运行
)占用了线程,因此其他goroutine都无法执行。如果将
main
函数的结尾更改为:

for {
    runtime.Gosched()
}
然后线程将被释放,另一个goroutine将被激活

func Gosched()

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

--

主goroutine(为{}
循环运行
)正在占用线程,因此其他goroutine都无法执行。如果将
main
函数的结尾更改为:

for {
    runtime.Gosched()
}
然后线程将被释放,另一个goroutine将被激活

func Gosched()

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


--

gorouting的执行顺序未定义。代码卡住是合法的。您可以更确定地与main()进行通信。例如

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

deliveryChannGoRouting的执行顺序未定义。代码卡住是合法的。您可以更确定地与main()进行通信。例如,place

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

deliveryChann和这里的问题-如果
GOMAXRPOCS
大于1,{}
将只锁定一个线程,其他goroutine可以在其他线程上进行调度。但由于某些原因,不能happen@creker-是的,我也想知道。我目前正在调查原因,因为我不确定原因。更令人费解的是,它在死锁之前运行了一段时间。我会理解它是否会死锁这将非常好。它非常适合在运行时有机会产生更多工作线程之前,{}
锁定进程的情况。仅供参考:我正在运行最新的golang版本,所以gomaxprocs不应该是1。我只了解1个cpu的问题(至少现在我了解),但对于多个CPU,我仍然不知所措。我们感兴趣的行为由调度程序定义。调度程序仅在当前goroutine(i)完成时切换线程的上下文,(ii)进行阻塞系统调用,(ii)进行阻塞运行时调用;或(iv)调用另一个函数(somethines)(参考:).我还是有点陌生,但我想知道:可能独立线程中的上下文切换依赖于调用调度程序的运行线程。我们的主goroutine永远不会调用它。这里的问题是-如果
GOMAXRPOCS
大于1,就不会发生这种情况。
for{}
将只锁定一个线程,其他goroutine可以在其他线程上进行调度。但由于某些原因,不能happen@creker-是的,我也想知道。我目前正在调查原因,因为我不确定原因。更令人费解的是,它在死锁之前运行了一段时间。我会理解它是否会死锁这将非常好。它非常适合在运行时有机会产生更多工作线程之前,{}
锁定进程的情况。仅供参考:我正在运行最新的golang版本,所以gomaxprocs不应该是1。我只了解1个cpu的问题(至少现在我了解),但对于多个CPU,我仍然不知所措。我们感兴趣的行为由调度程序定义。调度程序仅在当前goroutine(i)完成时切换线程的上下文,(ii)进行阻塞系统调用,(ii)进行阻塞运行时调用;或(iv)调用另一个函数(somethines)(参考:)。我对Go还是有点陌生,但我想知道:可能独立线程中的上下文切换依赖于调用调度程序的运行线程。我们的主goroutine永远不会调用它。为什么操作顺序很重要?通道在任何其他例程运行之前就打开了。运行最新版本的Go,所以没有必要sue了解CPU的数量。(很想了解这是如何发生的)。也许有一个例子可以解释我的意思。这是预期的行为。为什么操作顺序很重要?通道在任何其他例程运行之前打开。运行最新版本的go,所以CPU的数量没有问题。(我很想知道这是怎么发生的)。也许一个击球手的例子可以解释我的意思。这是预期的行为。