Тикер без тикера.Stop()

ГоДок говорит

Остановите бегущую строку, чтобы освободить связанные ресурсы

Однако кадр стека уничтожается, и GC собирает выделенный ресурс для этого кадра. Если мы не сделаем ticker.Stop(), как насчет выделенного ресурса, связанного с тикером? Как следующий код:

func startReloader(duration time.Duration, reloader an_sync.IReloader, datasource string) {
     ticker := time.NewTicker(duration / 10)
     <-ticker.C
     //dosomething here
 }
 //here is ticker struct
 type Ticker struct {
     C <-chan Time // The channel on which the ticks are delivered.
     r runtimeTimer
 }

У нас все еще есть утечка памяти?


person LLen    schedule 29.01.2021    source источник
comment
У нас все еще есть утечка памяти? Технически это утечка ресурсов. Неизвестно, является ли память частью утекшего ресурса (но да). В большинстве случаев документация верна, и вы должны просто делать то, что говорит документация (даже если вы думаете, что документация неверна, поскольку более вероятно, что документация верна, а вы ошибаетесь).   -  person Volker    schedule 29.01.2021
comment
@Volker Спасибо, я останавливаю таймер с помощью отсрочки каждый раз, когда создаю таймер. Просто я не понимаю, почему уничтоженный кадр стека не может освободить выделенные ресурсы. Я сделаю это. Спасибо еще раз   -  person LLen    schedule 29.01.2021
comment
Вы говорите о фрейме стека, который вообще не существует на уровне языка. Спецификация языка даже не содержит стека слов. Этот стек представляет собой деталь реализации каждого компилятора. Могут быть компиляторы go, которые вообще не используют стек. Таким образом, уничтожение несуществующего кадра стека ничего не освободит в этих компиляторах.   -  person Volker    schedule 29.01.2021


Ответы (1)


time.NewTicker() может запускать новые фоновые горутины для управления таймерами, которые имеют собственные стеки, независимые от стек вашей горутины. Так что да, если вы не вызовете Ticker.Stop(), ресурсы могут не освободиться даже когда ваша горутина заканчивается, и у вас больше нет ссылки на тикер.

Если вам больше не нужен тикер, назовите его Ticker.Stop(), как предлагает документ.

person icza    schedule 29.01.2021
comment
Спасибо, я не знал, что там есть фоновая горутина. Я получаю это сейчас. - person LLen; 29.01.2021