当运行下面的代码时,程序从 1.5M 左右开始,然后逐渐增长到 6.4M。我想知道为什么。 删除 time.sleep 可解决此问题。
有没有办法在默认情况下使用 for-select 模式并在默认情况下休眠一段时间而不更改任何内存?
在 sleep 后调用 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
}
}
}
最佳答案
您可以使用 select
实现超时并从 <-time.After()
接收:
select {
case res := <-c:
fmt.Println("do some work")
case <-time.After(time.Second * 1):
fmt.Println("timeout")
}
如果您想了解您的程序如何使用内存,您可以进行分析。 Here是一篇关于这个主题的好文章。
关于memory - Go: time.sleep 和内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36283788/