我正在尝试开发一个可以连续运行的程序。
它应该每秒钟从数据库中提取一些数据,sleepPool
并以非阻塞方式“处理”信息(至少这是我要尝试的方式)。
问题是内存在不断增长,所以我想知道自己是否做错了什么。
以下是我的程序的摘录。
var uCh = make(chan *user, buffLimit) //emits new users to process
var statsCh = make(chan *user, buffLimit) //emits new users to store
func main() {
go emitUser(db)
go consumeUser(db)
for ur := range statsCh {
log.Infoln(ur)
}
}
func emitUser(db *sql.DB) {
for {
time.Sleep(sleepPool * time.Second)
log.Infoln("looking for new users")
rows, err := rowsD.Query()
for rows.Next() {
uCh <- usr
}
}
}
func consumeUser(db *sql.DB) {
for usr := range uCh {
go func(usr *user) {
//do something with the user
statsCh <- usr
}(usr)
}
}
我读过我可能需要关闭通道,以便gc可以回收内存,但是我不确定该怎么做(因为程序应该连续运行),以及是否真的需要这样做,因为数据是始终读取(由保证范围main
),因此我假设内存已回收。
您没有足够的时间来启动GC,请等待一个小时然后检查内存。
如果您真的很想(坏主意并且会使程序变慢)迫使它释放内存,则可以使用以下方法:
import "runtime/debug"
//........
func forceFree() {
for _ = range time.Tick(30 * time.Second) {
debug.FreeOSMemory()
}
}
func init() {
go forceFree()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句