gpt4 book ai didi

memory-leaks - channel 和内存泄漏

转载 作者:IT王子 更新时间:2023-10-29 02:34:27 26 4
gpt4 key购买 nike

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

它应该每隔 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)
}
}

我读到我可能需要关闭 channel 以便 gc 可以回收内存,但我不确定该怎么做(因为程序应该连续运行)以及我是否真的需要这样做,因为数据总是被读取(由 main 的范围保证)所以我假设内存被回收。

最佳答案

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

如果你真的很想(坏主意,会减慢你的程序)强制它释放内存,你可以使用类似的东西:

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

func init() {
go forceFree()
}

关于memory-leaks - channel 和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25560176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com