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

发布于 2022-09-11 22:23:40 字数 134 浏览 26 评论 0

for {
    time.Sleep(200 * 毫秒)
}

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

美胚控场 2022-09-18 22:23:40

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

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

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

眼前雾蒙蒙 2022-09-18 22:23:40

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

强辩 2022-09-18 22:23:40

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

回心转意 2022-09-18 22:23:40
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)
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文