猿问

Go:time.sleep 和内存使用

运行下面的代码时,程序从1.5M左右开始,然后逐渐增长到6.4M。我想知道为什么。删除time.sleep解决了这个问题。


有没有办法在默认情况下使用 for-select 模式并在默认情况下休眠一段时间而无需更改内存?


在睡眠后调用runtime.GC()确实解决了这个问题。我们可以在不调用 GC 的情况下实现相同的目标吗?


package main


import (

    "time"

)


func main() {

    c := make(chan struct{})

    for {

        select {

        case <-c:

            //some work

        default:

            //some work

            time.Sleep(time.Millisecond * 1)

        }

    }

}

同:


package main


import (

    "time"

)


func main() {

    c := make(chan struct{})

    for {

        select {

        case <-c:

        case <-time.After(time.Millisecond * 10):

        }

    }

}

经过一段时间的研究,我使用以下代码实现了它。仍然想知道为什么 time.sleep 会增加内存使用率?


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

        }

    }

}


FFIVE
浏览 297回答 2
2回答

潇湘沐

您可以使用 a 实现超时select并从<-time.After()以下接收:select {&nbsp; case res := <-c:&nbsp; &nbsp; fmt.Println("do some work")&nbsp; case <-time.After(time.Second * 1):&nbsp; &nbsp; fmt.Println("timeout")}如果您想了解您的程序如何使用内存,您可以进行分析。这是一篇关于这个主题的好文章。

拉莫斯之舞

经过一段时间的研究,我使用以下代码实现了它。package mainimport (&nbsp; &nbsp; "time")func main() {&nbsp; &nbsp; c := make(chan bool)&nbsp; &nbsp; timer := time.NewTimer(0)&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case <-c:&nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timer.Reset(time.Millisecond * 1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <-timer.C&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Go
我要回答