gpt4 book ai didi

go - 为什么 select{ } 与 select {case} 导致不同的调度

转载 作者:数据小太阳 更新时间:2023-10-29 03:47:13 26 4
gpt4 key购买 nike

1.选择{case}

    "fmt"
"runtime"
"time"
)

func main() {
runtime.GOMAXPROCS(1)

go func() {
fmt.Println("a")
}()
go func() {
fmt.Println("b")
}()
go func() {
fmt.Println("c")
}()

fmt.Println("d")

select {
case _ = <-time.After(time.Second):
}
}

结果:dabc

2.选择{}

package main
import (
"fmt"
"runtime"

)
func main() {
runtime.GOMAXPROCS(1)

go func() {
fmt.Printf("a")

}()

go func() {
fmt.Printf("b")

}()

go func() {
fmt.Printf("c")

}()

fmt.Printf("d")
select {}

}

结果:dcab

因为我设置了“runtime.GOMAXPROCS(1)”,所以我的程序中只有一个“Processor”。

一个“Processor”只有一个“runq”,in/out操作是“FIFO”

我的问题是“为什么总是……不是兰特……”

最佳答案

终于明白了。

Processor.runq 是先进先出的,这里还有一个变量(runnext),runnext 保存的是最新的goroutine,下一个要处理的goroutine。

最新的 goroutine kicks p.runnext

Timer 创建一个 goroutine,这个 goroutine 开始 p.runnext。


Processor的runnext被定时器创建的goroutine踢调,引导下一个执行的是定时器的goroutine,然后其他的FIFO

关于go - 为什么 select{ } 与 select {case} 导致不同的调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55632188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com