golang中定时器cpu使用率高的现象详析

2020-01-28 13:05:29刘景俊

那么问题又来了,定时器为什么会产生锁? 定时器不外乎就那几个方法,小顶堆呀,红黑树呀…. golang使用堆来构建全局定时器,既然是堆,那么肯定就要有锁,开了几百个协程,如果有N个P,那么几百个协程会分派在不同的P上。 协程需要跑在线程上,那么这么多的线程去操作heap堆,自然就会有更多的锁冲突,锁操作了。

先前的cpu占用率高的代码样例:


# xiaorui.cc
 var ticker = time.NewTicker(100 * time.Millisecond)
 defer ticker.Stop()
 var counter = 0
 for {
  select {
  case <-serverDone:
   return
  case <-ticker.C:
   counter += 1
  }
 }
}

如何解决上面说的问题?

要么就不要用定时器

如果非要使用,可以把时间精度放大,或者 自定义定时器,比如开发一个时间轮,时间轮的刻度可以配置成一毫秒,这样可以收敛很多的定时任务。 时间轮也是各大公司推荐的方案。

可以参考下面时间轮的实现…

END

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对易采站长站的支持。