在 GO 教程中,我们有这张幻灯片:Goroutinespackage mainimport ( "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 免于死亡如此重要?
3 回答
慕勒3428872
TA贡献1848条经验 获得超6个赞
如果您删除 ,time.Sleep
则不会给say("world")
goroutine 运行的机会。goroutine 调度器不是抢占式的。在另一个 goroutine 运行之前,你的 goroutine 必须放弃控制。放弃控制的一种方法是运行time.Sleep
.
如果time.Sleep
从say
函数中取出 ,则主 goroutine 运行 5 次而不会放弃对辅助 goroutine 的控制,然后当主 goroutine 从say
程序返回时退出,因为没有任何东西可以使程序保持活动状态。
- 3 回答
- 0 关注
- 277 浏览
添加回答
举报
0/150
提交
取消