【问题标题】:Do I need to explicitly stop a ticker whose reference has been reassigned?我是否需要明确停止其引用已重新分配的代码?
【发布时间】:2017-03-28 18:55:10
【问题描述】:

我使用time.Ticker 定期做一些事情。我希望能够更改stuff 发生的频率:

for {
        select {
        case <-ticker.C:
            //do stuff
        case t := <-newTicker:
            oldTicker := ticker
            ticker = t
            oldTicker.Stop()
        }
    }

我是否需要清理代码以避免内存泄漏,或者将重新分配ticker

case ticker := <-newTicker:

够了吗?

【问题讨论】:

  • 来自文档“停止代码以释放相关资源。”

标签: go


【解决方案1】:

正如JimB 提到的time 包GoDoc。

time.NewTicker下,提到了以下内容。

停止代码以释放相关资源。

如果您运行 oldTimer.Stop()oldTicker 将在退出 case 语句后被垃圾回收,因为它超出了范围。

【讨论】:

  • 在这种情况下,尝试关闭频道会出现以下错误:cannot close receive-only channelThis question 表示不必关闭每个通道,垃圾收集器会发现oldTicker.C 可以被清理。我担心的是,如果这运行一段时间,将会有很多 oldTickers 留在周围。
  • 很抱歉。您链接到的答案是正确的。 'timer.C' 是一个只接收频道&lt;-chan Time。答案的最后一部分是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 2017-08-18
  • 2013-11-11
  • 2012-08-03
  • 2019-03-16
  • 1970-01-01
相关资源
最近更新 更多