Go的定时器应用(实现定时任务
使用Go定时器实现定时任务
通过go的select + time包下的time.Ticker可实现指定时间间隔的任务
代码如下
package main
import (
"fmt"
"time"
)
type Tasker struct {
t *time.Ticker
stopChan chan struct{}
}
func NewTasker(d time.Duration) *Tasker {
return &Tasker{
t: time.NewTicker(d),
stopChan: make(chan struct{}),
}
}
func (t *Tasker) Stop() {
t.stopChan <- struct{}{}
}
// go定时器应用
func main() {
//新增个每隔1秒执行的任务器
tasker := NewTasker(time.Second)
//模拟发送停止信号
go func(tt *Tasker) {
time.Sleep(time.Second * 5)
tt.stopChan <- struct{}{}
}(tasker)
for true {
select {
case <-tasker.t.C: //实现每隔1s执行任务
execTask()
case <-tasker.stopChan:
fmt.Println("任务停止!!!")
return
//不能用break,是因为break跳出select,不能跳出for循环,所以还会继续执行select
//break
//case <-tasker.otherChan:
//开其他分支,做一些其他任务(例如:将接受的任务专门放到一个chan中,执行的任务放到另一个chan中、移除任务队列中的任务等等)
}
}
}
//执行任务
func execTask() {
fmt.Printf("Task:%s\n", time.Now().Format("2006-01-02 15:04:05"))
}