为什么需要time.sleep运行某些goroutine?
在GO教程中,我们有这张幻灯片:Goroutines
package 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.Sleep
可以使goroutine免于死亡?
回答:
如果将其删除,time.Sleep
则不会给say("world")
goroutine运行的机会。goroutine调度程序不是抢占式的。您的goroutine必须放弃控制才能运行另一个goroutine。放弃控制的一种方法是奔跑time.Sleep
。
如果time.Sleep
从say
函数中取出,则主goroutine将运行5次而不会放弃对辅助goroutine的控制,然后当主goroutine从say
程序返回时退出,因为没有任何东西可以使程序保持活动状态。
以上是 为什么需要time.sleep运行某些goroutine? 的全部内容, 来源链接: utcz.com/qa/423795.html