运行下面的代码时,程序从大约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
}
}
}
答案 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
}
}
}