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

在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免于死亡?

回答:

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

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

以上是 为什么需要time.sleep运行某些goroutine? 的全部内容, 来源链接: utcz.com/qa/423795.html

回到顶部