登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-05-01 17:57:38 245浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《为什么 select{ } 与 select {case} 会导致不同的调度》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

1.选择{案例}

"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):
    }
}

result: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 {}

}

result:dcab

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

一个“processor”只有一个“runq”,in/out操作是“fifo”

我的问题是“为什么总是......而不是兰德......”


解决方案


Finally figured it out.

Processor.runq is FIFO, there's another variable(runnext) here, runnext saves the lastest goroutine which where will be processed next.

The latest goroutine kicks p.runnext

Timer creates a goroutine ,and this goroutine kicks p.runnext.

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

好了,本文到此结束,带大家了解了《为什么 select{ } 与 select {case} 会导致不同的调度》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>