为了账号安全,请及时绑定邮箱和手机立即绑定

Go:time.sleep 和内存使用

Go:time.sleep 和内存使用

Go
FFIVE 2021-12-27 18:03:01
运行下面的代码时,程序从1.5M左右开始,然后逐渐增长到6.4M。我想知道为什么。删除time.sleep解决了这个问题。有没有办法在默认情况下使用 for-select 模式并在默认情况下休眠一段时间而无需更改内存?在睡眠后调用runtime.GC()确实解决了这个问题。我们可以在不调用 GC 的情况下实现相同的目标吗?package mainimport (    "time")func main() {    c := make(chan struct{})    for {        select {        case <-c:            //some work        default:            //some work            time.Sleep(time.Millisecond * 1)        }    }}同:package mainimport (    "time")func main() {    c := make(chan struct{})    for {        select {        case <-c:        case <-time.After(time.Millisecond * 10):        }    }}经过一段时间的研究,我使用以下代码实现了它。仍然想知道为什么 time.sleep 会增加内存使用率?package mainimport (    "time")func main() {    c := make(chan bool)    timer := time.NewTimer(0)    for {        select {        case <-c:        default:            timer.Reset(time.Millisecond * 1)            <-timer.C        }    }}
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

您可以使用 a 实现超时select并从<-time.After()以下接收:


select {

  case res := <-c:

    fmt.Println("do some work")

  case <-time.After(time.Second * 1):

    fmt.Println("timeout")

}

如果您想了解您的程序如何使用内存,您可以进行分析。这是一篇关于这个主题的好文章。


查看完整回答
反对 回复 2021-12-27
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

经过一段时间的研究,我使用以下代码实现了它。


package main


import (

    "time"

)


func main() {

    c := make(chan bool)

    timer := time.NewTimer(0)

    for {

        select {

        case <-c:

        default:

            timer.Reset(time.Millisecond * 1)

            <-timer.C

        }

    }

}


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 296 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号