在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
"time"
有什么重要的意义time.Sleep可以使goroutine免于死亡?
如果将其删除,time.Sleep则不会给say("world")goroutine运行的机会。goroutine调度程序不是抢占式的。您的goroutine必须放弃控制才能运行另一个goroutine。放弃控制的一种方法是奔跑time.Sleep。
say("world")
如果time.Sleep从say函数中取出,则主goroutine将运行5次而不会放弃对辅助goroutine的控制,然后当主goroutine从say程序返回时退出,因为没有任何东西可以使程序保持活动状态。
say