golang在写死循环的时候, 总是要加上一个time.Sleep 为啥
for {
time.Sleep(200 * 毫秒)
}
为啥要加个time.Sleep呢, 因为要给cpu休息下, 不然负载会高?
但是有更细致的说法么, 关于负载? sleep时长?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
for {
time.Sleep(200 * 毫秒)
}
为啥要加个time.Sleep呢, 因为要给cpu休息下, 不然负载会高?
但是有更细致的说法么, 关于负载? sleep时长?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
这个问题要结合具体的场景来看。
如果这段代码是某个教程的代码片段,作者可能有几个目的:①降低 CPU 负载,如果没有 time.Sleep 的调用,这个 for 循环会一直占用一个 cpu 核做无用功,造成资源上的极大浪费;② 说明 goroutine 的一个调度问题,正如第一点所描述的,如果一个 for 选好一直占用 cpu 核做无用功,同时你的电脑只有一个 cpu 核的情况下,那么代码将一直 “卡” 在这个 for 循环里跳不出来,但是加了 time.Sleep 则可以促使 调度器 在一定时间把这个 for 循环所在的线程调度走从而把 cpu 资源让给其他的协程。
sleep 的时间没有固定值,是根据需要设定的,几毫秒几秒几分钟看需求了。
这段代码有什么用?
要是for循环中有select+通道 这种模式作为主循环还比较常见
1.14之前确实会出现for循环导致的所有物理线程被全部阻塞,1.14之后在sysmon监控中加入了goroutine执行时长的监控,超过10ms会发生调度
如果
DoSomething()
一直失败,就会疯狂调用DoSomething()
所以会 sleep 一下
或