一尘不染

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

go

在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.Sleep可以使goroutine免于死亡?


阅读 653

收藏
2020-07-02

共1个答案

一尘不染

如果将其删除,time.Sleep则不会给say("world")goroutine运行的机会。goroutine调度程序不是抢占式的。您的goroutine必须放弃控制才能运行另一个goroutine。放弃控制的一种方法是奔跑time.Sleep

如果time.Sleepsay函数中取出,则主goroutine将运行5次而不会放弃对辅助goroutine的控制,然后当主goroutine从say程序返回时退出,因为没有任何东西可以使程序保持活动状态。

2020-07-02