在日常的开发过程中,我们免不了与定时器打交道。通常需要定时执行某个程序,可能是每隔一段时间执行一次,也可能是固定的每天在某一个时间点执行一次。总之,定时器的使用是非常频繁的,下面将介绍几种常用定时器。
1. 假设每隔三秒,我们打印一段信息,可以采用如下方式。我们将要执行的程序放在一个go协程中去执行。
package main
import (
"fmt"
"time"
)
func main() {
go func() {
for {
fmt.Println("hello")
time.Sleep(time.Second * 3)
}
}()
time.Sleep(time.Second * 60)
}
2. 如果需要在某个某个固定时间打印某一信息,可采用如下方式:其中第一个协程不断的检查当前时间是否是我们所记录的目标时间,如果是,则该协程向管道nahc写入一个bool类型的值;第二个协程不断的检查管道nahc中是否存在值,如果存在,则说明到达我们所规定的目标时间,于是打印某一信息。
package main
import (
"time"
"sync"
"fmt"
)
var (
t = "22:51:00"
nahc chan bool
)
func init() {
nahc = make(chan bool)
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
for {
fmt.Println(t)
now := time.Now()
location, _ := time.LoadLocation("Local")
aimTime, _ := time.ParseInLocation("2006-01-02 15:04:05", fmt.Sprintf("%s %s", now.Format("2006-01-02"), t), location)
if now.After(aimTime) {
aimTime, _ = time.ParseInLocation("2006-01-02 15:04:05", fmt.Sprintf("%s %s", now.AddDate(0, 0, 1).Format("2006-01-02"), t), location)
}
duration := aimTime.Sub(now)
select {
case <-time.After(duration):
nahc <- true
}
}
}()
go func() {
defer wg.Done()
for range nahc {
fmt.Println("hello")
}
}()
wg.Wait()
}
3. 下面这个定时器采用了time包的NewTicker函数。
report_ticker := time.NewTicker(time.Second * time.Duration(3))
go func() {
for range report_ticker.C {
go fmt.Println("hello")
}
}()