Я искал переполнение стека для чего-то похожего на это и не смог найти именно то, что искал.Я прошу прощения, если это очевидная ошибка, поскольку я только недавно начал писать на Go, но я заранее благодарен за любое объяснение.В настоящее время у меня есть процедура go, которая находится в диапазоне значений *Ticker
.Теперь эта процедура запускается все время, пока моя программа жива, так как она проверяет наличие необходимых обновлений.Я начал осознавать, что моя программа со временем теряет память.Это начинает становиться очень заметным после 20-30 часов работы.
func (s *Server) checkForUpdates() { // go routine
ticker := time.NewTicker(time.Minute * time.Duration(s.checkTime)) //x.checkTime = 2 minutes
defer ticker.Stop()
for t := range ticker.C { // will loop every 2 minutes
fmt.Println("the update check happened at %d\n", t)
// do the updates
}
}
Я сузил утечку до рутины, и прочитал все время Time может утечка памяти.Убедитесь, что вы закрыли *Ticker
, который вы создали, как только вы закончили с рутиной go.Однако моя программа работает вечно, пока я не убью ее.Так что эта процедура будет работать вечно, пока я не решу остановить программу.Я знаю, что это может быть глупо думать, но я подумал, что это может быть проблема с t := range ticker.C
.Потому что этот цикл никогда не останавливается, пока я не убью.Так что t
никогда не выйдет.Поэтому я подумал, что :=
повторно объявляет переменную каждый раз, когда я зацикливаюсь?Затем я сделал цикл:
for _ = range ticker.C { // completely got rid of declaration of time.Time
// do updates ...
}
И до сих пор, кажется, это работает ... но я действительно не понимаю, почему, или, возможно, это не должно было помочь, и есть кое-что еще, что я 'Я делаю неправильно.
Я ценю любую помощь / объяснение этого.Спасибо.