在GO教程中,我们有以下幻灯片:戈鲁廷斯
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"行)并再次运行程序,则只剩下只在屏幕上写了5次 "hello“。
time.Sleep有什么重要的,能让它免于死亡呢?
发布于 2013-04-02 18:27:12
如果删除time.Sleep,就不会给say("world") goroutine一个运行的机会。goroutine调度程序不是抢占性的。你的猩猩必须放弃控制,否则另一个峡谷将运行。放弃控制的一种方法是运行time.Sleep。
如果您从time.Sleep函数中取出say,那么主goroutine运行5次,而不放弃对次要goroutine的控制,然后当主goroutine从say返回时,程序退出,因为没有什么可以使程序存活。
https://stackoverflow.com/questions/15771232
复制相似问题