猿问

为什么需要 time.sleep 来运行某些 goroutines?

在 GO 教程中,我们有这张幻灯片:Goroutines


package main


import (

    "fmt"

    "time"

)


func say(s string) {

    for i := 0; i < 5; i++ {

        time.Sleep(100 * time.Millisecond)

        fmt.Println(s)

    }

}


func main() {

    go say("world")

    say("hello")

}

运行此代码会产生预期的结果(“world”和“hello”交替写入屏幕 5 次)。


然而,如果我们注释掉time.Sleep(因此,"time"导入的行)并再次运行程序,我们只剩下“hello”写在屏幕上五次。


是什么让time.Sleepgoroutine 免于死亡如此重要?


慕虎7371278
浏览 278回答 3
3回答

慕勒3428872

如果您删除 ,time.Sleep则不会给say("world")goroutine 运行的机会。goroutine 调度器不是抢占式的。在另一个 goroutine 运行之前,你的 goroutine 必须放弃控制。放弃控制的一种方法是运行time.Sleep.如果time.Sleep从say函数中取出 ,则主 goroutine 运行 5 次而不会放弃对辅助 goroutine 的控制,然后当主 goroutine 从say程序返回时退出,因为没有任何东西可以使程序保持活动状态。
随时随地看视频慕课网APP

相关分类

Go
我要回答