You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
1.9 KiB

  1. /**
  2. * @Author: Aceld
  3. * @Date: 2019/4/30 17:42
  4. * @Mail: danbing.at@gmail.com
  5. */
  6. package ztimer
  7. import (
  8. "time"
  9. )
  10. const (
  11. HOUR_NAME = "HOUR"
  12. HOUR_INTERVAL = 60 * 60 * 1e3 //ms为精度
  13. HOUR_SCALES = 12
  14. MINUTE_NAME = "MINUTE"
  15. MINUTE_INTERVAL = 60 * 1e3
  16. MINUTE_SCALES = 60
  17. SECOND_NAME = "SECOND"
  18. SECOND_INTERVAL = 1e3
  19. SECOND_SCALES = 60
  20. TIMERS_MAX_CAP = 2048 //每个时间轮刻度挂载定时器的最大个数
  21. )
  22. /*
  23. 注意
  24. 有关时间的几个换算
  25. time.Second() = time.Millisecond * 1e3
  26. time.Millisecond(毫秒) = time.Microsecond * 1e3
  27. time.Microsecond(微秒) = time.Nanosecond * 1e3
  28. time.Now().UnixNano() ==> time.Nanosecond (纳秒)
  29. */
  30. /*
  31. 定时器实现
  32. */
  33. type Timer struct {
  34. //延迟调用函数
  35. delayFunc *DelayFunc
  36. //调用时间(unix 时间, 单位ms)
  37. unixts int64
  38. }
  39. //返回1970-1-1至今经历的毫秒数
  40. func UnixMilli() int64 {
  41. return time.Now().UnixNano() / 1e6
  42. }
  43. /*
  44. 创建一个定时器,在指定的时间触发 定时器方法
  45. df: DelayFunc类型的延迟调用函数类型
  46. unixNano: unix计算机从1970-1-1至今经历的纳秒数
  47. */
  48. func NewTimerAt(df *DelayFunc, unixNano int64) *Timer {
  49. return &Timer{
  50. delayFunc: df,
  51. unixts: unixNano / 1e6, //将纳秒转换成对应的毫秒 ms ,定时器以ms为最小精度
  52. }
  53. }
  54. /*
  55. 创建一个定时器在当前时间延迟duration之后触发 定时器方法
  56. */
  57. func NewTimerAfter(df *DelayFunc, duration time.Duration) *Timer {
  58. return NewTimerAt(df, time.Now().UnixNano()+int64(duration))
  59. }
  60. //启动定时器,用一个go承载
  61. func (t *Timer) Run() {
  62. go func() {
  63. now := UnixMilli()
  64. //设置的定时器是否在当前时间之后
  65. if t.unixts > now {
  66. //睡眠,直至时间超时,已微秒为单位进行睡眠
  67. time.Sleep(time.Duration(t.unixts-now) * time.Millisecond)
  68. }
  69. //调用事先注册好的超时延迟方法
  70. t.delayFunc.Call()
  71. }()
  72. }