【问题标题】:Why Goroutine Can Get Scheduled After Busy Loop?为什么 Goroutine 可以在 Busy Loop 后被调度?
【发布时间】:2019-12-03 05:00:08
【问题描述】:

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

我从许多发帖者那里听说忙循环通常会阻止调度,因为它们没有给 go sheduler 留给调度器的机会。如果这是真的,为什么 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++
    }
}

更新: 我很困惑,所以我没有用更清楚的方式来解决这个问题。今天改了内容,还是有同样的疑问。

【问题讨论】:

  • main 中的繁忙循环一旦开始运行,可能不会让给其他 goroutines。将繁忙的循环替换为select {} 以获得您期望的结果。

标签: go scheduling goroutine


【解决方案1】:

根据@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++
    }
}

【讨论】:

    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 2020-03-03
    • 1970-01-01
    • 2020-06-16
    • 2015-07-05
    • 2021-09-14
    相关资源
    最近更新 更多