Go:time.sleep和内存使用情况

时间:2016-03-29 12:04:31

标签: memory time go 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
        }
    }
}

2 个答案:

答案 0 :(得分:-1)

您可以使用select实现超时,并从<-time.After()

接收
select {
  case res := <-c:
    fmt.Println("do some work")
  case <-time.After(time.Second * 1):
    fmt.Println("timeout")
}

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

答案 1 :(得分:-2)

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

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
        }
    }
}