Должны ли мы остановить этот вид тикера? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть тикер времени, который будет выполнять функцию в течение интервала времени (например, каждые 5 минут, 10 минут). Я создаю этот тикер времени в рамках программы. Я слышал, что этот вид тикера может привести к утечке памяти, даже если приложение остановилось. Этот тикер будет работать до тех пор, пока приложение работает. Должно ли это остановиться? как правильно это остановить? Вот моя реализация:

go func() {
    for range time.Tick(5 * time.Minute) {
        ExecuteFunctionA()
    }
}()

Какая правильная реализация для тикера времени, подобного этому?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы можете использовать канал в качестве посредника, чтобы правильно остановить тикер.

Обычно я делал это следующим образом:

var stopChan chan bool = make(chan bool)

func Stop() {
    stopChan <- true
}

func Run() {
    go func() {
       ticker := time.NewTicker(5 * time.Minute)
       for {
           select {
               case <- c.stopChan:
                   ticker.Stop()
                   return
               case <- ticker.C:
                   ExecuteFunctionA()
           } 
       }
    }()
}

И вы можете вызвать функцию Stop в тот момент, когда хотите безопасно остановить тикер.

0 голосов
/ 29 августа 2018

Ничего не просочится, если «приложение остановлено». Предупреждение в документации относится к тому факту, что сборщик мусора не сможет восстановить канал после того, как он создан (time.Tick() инициализирует и возвращает канал), и он будет находиться в памяти, даже если вы решите break из вашего for цикла. Исходя из вашего описания в вопросе, это не должно быть проблемой для вас, так как вы хотите, чтобы тикер работал, пока приложение работает. Но если вы решите иначе, вы можете использовать альтернативный способ, например:

go func() {
  for {
    time.Sleep(time.Duration(5) * time.Minute)
    go ExecuteFunctionA()
    if someConditionIsMet {
      break // nothing leaks in this case
    }
  }
}()
...