通道和内存泄漏

嘿:

我正在尝试开发一个可以连续运行的程序。

它应该每秒钟从数据库中提取一些数据,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),因此我假设内存已回收。

OneOfOne:

您没有足够的时间来启动GC,请等待一个小时然后检查内存。

如果您真的很想(坏主意并且会使程序变慢)迫使它释放内存,则可以使用以下方法:

import "runtime/debug"
//........
func forceFree() {
    for _ = range time.Tick(30 * time.Second) {
        debug.FreeOSMemory()
    }
}

func init() {
    go forceFree()
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章