golang在写死循环的时候, 总是要加上一个time.Sleep 为啥

暂停_学
  • 33
for {
    time.Sleep(200 * 毫秒)
}

为啥要加个time.Sleep呢, 因为要给cpu休息下, 不然负载会高?
但是有更细致的说法么, 关于负载? sleep时长?

回复
阅读 4.9k
4 个回答

这个问题要结合具体的场景来看。

如果这段代码是某个教程的代码片段,作者可能有几个目的:①降低 CPU 负载,如果没有 time.Sleep 的调用,这个 for 循环会一直占用一个 cpu 核做无用功,造成资源上的极大浪费;② 说明 goroutine 的一个调度问题,正如第一点所描述的,如果一个 for 选好一直占用 cpu 核做无用功,同时你的电脑只有一个 cpu 核的情况下,那么代码将一直 “卡” 在这个 for 循环里跳不出来,但是加了 time.Sleep 则可以促使 调度器 在一定时间把这个 for 循环所在的线程调度走从而把 cpu 资源让给其他的协程。

sleep 的时间没有固定值,是根据需要设定的,几毫秒几秒几分钟看需求了。

这段代码有什么用?
要是for循环中有select+通道 这种模式作为主循环还比较常见

jeffzhangme
  • 1
新手上路,请多包涵

1.14之前确实会出现for循环导致的所有物理线程被全部阻塞,1.14之后在sysmon监控中加入了goroutine执行时长的监控,超过10ms会发生调度

segsang
  • 2
新手上路,请多包涵
for {
    err := DoSomething()
    if err != nil {
        continue
    }
    // do something else
}

如果 DoSomething() 一直失败,就会疯狂调用 DoSomething()

所以会 sleep 一下

for {
    sleep(time.Second)
    err := DoSomething()
    if err != nil {
        continue
    }
    // do something else
}

for {
    err := DoSomething()
    if err != nil {
        goto End
    }
    // do something else
    
End:    
   sleep(time.Second)
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏