go定时器使用

361 阅读1分钟

前言

在go中,如果需要程序执行定时任务或者延时任务任务,它在time包提供了一些方法供使用

定时器使用

NewTimer

time.NewTimer() 是创建 Timer 的其中一种方式,通过传入一个定时时间,如

package main

import (
   "log"
   "time"
)

func main() {
   a := time.NewTimer(3 * time.Second)
   log.Println("============执行开始")
   <-a.C
   log.Println("============执行结束")
}

程序延时3s执行,输出结果为

image.png 但是NewTimer不用Reset()不能被复用,复用的话,会报错,如

package main

import (
   "fmt"
   "log"
   "time"
)

func main() {
   a := time.NewTimer(3 * time.Second)
   log.Println("============执行开始")
   <-a.C
   log.Println("============执行结束")
   <-a.C
   fmt.Println("asdasdsd")
}

image.png 重置定时器

package main

import (
   "log"
   "time"
)

func main() {
   a := time.NewTimer(3 * time.Second)
   for {
      select {
      case x, y := <-a.C:
         log.Println("===========", x, y)
         a.Reset(3 * time.Second)
      }
   }
}

输出结果为

image.png 停止定时器为

package main

import (
   "log"
   "time"
)

func main() {
   a := time.NewTimer(3 * time.Second)
   defer a.Stop()
   for {
      select {
      case x, y := <-a.C:
         log.Println("===========", x, y)
         a.Reset(3 * time.Second)
      }
   }
}

NewTicker

NewTicker定时器不用重置就可以实现定时任务

package main

import (
   "log"
   "time"
)

func main() {
   a := time.NewTicker(3 * time.Second)
   defer a.Stop()
   for {
      select {
      case x, y := <-a.C:
         log.Println("===========", x, y)
      }
   }
}

Stop()方法是停止定时器

Rest()方法重置定时器

package main

import (
   "log"
   "time"
)

func main() {
   a := time.NewTicker(3 * time.Second)
   defer a.Stop()
   for {
      select {
      case x, y := <-a.C:
         log.Println("===========", x, y)
         a.Reset(4 * time.Second)
      }
   }
}

image.png

time.After()

time.After()用于延时几秒后执行,如

package main

import (
   "log"
   "time"
)

func main() {
   a := time.After(3 * time.Second)
   log.Println("===========开始执行")
   <-a
   log.Println("===========执行结束")
}

image.png 但是不能被复用

总结

time包提供了定时任务供调用,可以合理的利用里面的方法实现定时任务