Ticker的使用(定时执行)

package main

import (
   "fmt"
   "time"
)

// GetDateTime 获取当前时间的日期时间字符串
// @return string 日期时间字符串
func GetDateTime() string {
   var location, _ = time.LoadLocation("Asia/Shanghai")
   return time.Unix(time.Now().In(location).Unix(), 0).In(location).Format("2006-01-02 15:04:05")
}

func main() {
   ticker := time.NewTicker(time.Second) // 创建Ticker,NewTicker()的参数就是定时执行任务的频率
   counter := 0
   tickerStopChan := make(chan bool)

   // 由于“for range ticker.C”是死循环,所以使用协程执行定时任务防止发生阻塞
   go func() {
      for range ticker.C {
         counter++
         fmt.Printf("[%+v] 第%+v次执行 \n", GetDateTime(), counter)

         if counter >= 5 {
            ticker.Stop()          // 停止Ticker
            tickerStopChan <- true // 向管道发送数据
            break
         }
      }
   }()
   fmt.Println("Ticker已启动")

   // 由于是用协程执行定时任务,所以必须阻止main()退出,直到定时任务执行完才退出
ForLabel: // 设置for循环的标签
   for {
      select {
      case stop, ok := <-tickerStopChan: // 从管道接收数据
         {
            if ok == true && stop == true {
               fmt.Println("Ticker已停止")
               break ForLabel // 终止for循环,这是for-select-case结构跳出循环的特定写法
            }
         }
      default:
         {
            // TODO...
         }
      }
   }

   //========== 输出流程 ==========//
   // Ticker已启动
   // [2008-08-08 08:08:08] 第1次执行
   // [2008-08-08 08:08:09] 第2次执行
   // [2008-08-08 08:08:10] 第3次执行
   // [2008-08-08 08:08:11] 第4次执行
   // [2008-08-08 08:08:12] 第5次执行
   // Ticker已停止
}

//========== 总结 ==========//
// 1、Go里的Ticker相当于JavaScript里的setInterval(),就是定时执行任务。
// 2、Ticker和Timer一样也有Stop()方法和Reset()方法来实现停止和重置定时任务。

Copyright © 2024 码农人生. All Rights Reserved