go - 为什么 Goroutine 在 Busy Loop 之后还能被调度?

标签 go scheduling goroutine

请参阅下面的这些代码。 我不会在任何制作中这样做,只是为了学习目的。

我从许多发帖者那里听说忙循环通常会阻止调度,因为它们没有给 go sheduler 到 scheduler 留下任何机会。如果这是真的,为什么 deadloop() goroutine 可以被调度??

我正在使用 golang 1.12 并在 Windows 操作系统上进行测试。

func main()  {

    go deadloop()         // v1 -- keeps printing forever

    var i =1
    for {
        i++
    }
}

func deadloop() {
    i := 0
    for {
        fmt.Printf("from deadloop\n")
        i++
    }
}

更新: 我很困惑,所以我没有把问题说得更清楚。今天改了内容,还是有同样的疑问。

最佳答案

根据@Cerise 的回答,这是因为忙循环,for 循环在您的 main 函数中。如果循环的目的是防止 main 退出,那么不要使用 for,而是使用 select。见下面的代码:

func main()  {
    go deadloop2()

    select { } // <----- here
}

func deadloop2() {
    i := 0
    for {
        fmt.Printf("from deadloop i=%d\n", i)
        i++
    }
}

关于go - 为什么 Goroutine 在 Busy Loop 之后还能被调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57193098/

相关文章:

Go模块替换为本地模块的特定版本

docker - 当部署到 Docker 时,在 Golang 中实现的 Apache Kafka 消费者会出现 panic

python - 使用 python apscheduler 调度作业

Go 的 sync.WaitGroup 丢失了其中一个响应

go - 不可能类型开关盒 : cannot have dynamic type

mongodb - 无法使用Golang从MongoDB集合中获取数据

linux - 尼斯值与静态优先级(Linux 调度)

python - Python Web 应用程序的预定后台函数

goroutine 上下文取消 panic