目录
go定时任务
Time
NewTimer
package main
import (
"fmt"
"time"
)
func cronTimer() {
/**
timer定时器 实现一些定时操作 本质通过chan阻塞实现 且只执行一次
t:=time.NewTimer(时间): 新建定时器
<-t.C :管道取值阻塞
t.Stop(): 主动停止任务
t.Reset(时间):重新设置定时任务执行时间
*/
// 方式1
fmt.Println("start=", time.Now().Format("20060102-15:04:05"))
duration := time.Second * 3
t := time.NewTimer(duration)
//for {
// t.Reset(duration) // 重设任务执行的时间间隔并复用timer
// select {
// case <-t.C: // 管道阻塞
// fmt.Println("running=" + time.Now().Format("20060102-15:04:05"))
// default:
// fmt.Println("blocked=" + time.Now().Format("20060102-15:04:05"))
// time.Sleep(duration)
// }
//}
<-t.C
fmt.Println("end=", time.Now().Format("20060102-15:04:05")) // 原定是3秒后执行 重设reset后1秒执行
fmt.Println("====================================================")
fmt.Println("start=", time.Now().Format("20060102-15:04:05"))
t2 := time.NewTimer(time.Second * 3)
go func() {
<-t2.C
}()
stopFlag := t2.Stop() // 主动停止任务
if stopFlag {
fmt.Println("end=", time.Now().Format("20060102-15:04:05"))
}
fmt.Println("====================================================")
// 方式2
fmt.Println("start=", time.Now().Format("20060102-15:04:05"))
<-time.After(time.Second * 2) // 管道阻塞
fmt.Println("end=", time.Now().Format("20060102-15:04:05"))
fmt.Println("====================================================")
// 方式3-带任务处理函数
taskChan := make(chan bool, 1)
time.AfterFunc(time.Second*3, func() {
taskChan <- true
})
for {
select {
case <-taskChan:
fmt.Printf("taskEnd=%s\n", time.Now().Format("20060102-15:04:05"))
return
default:
fmt.Println("blocked=" + time.Now().Format("20060102-15:04:05"))
time.Sleep(time.Second * 2)
}
}
}
func main() {
cronTimer()
}
NewTicker
package main
import (
"errors"
"fmt"
"time"
)
type taskFunc func() error // 任务函数
type ticker struct { // 重定义ticker定时器
t *time.Ticker
f taskFunc
}
func createTicker(duration int, fn taskFunc) *ticker { // 重写新建ticker函数
if duration <= 0 {
panic(errors.New("invalid duration"))
}
return &ticker{
t: time.NewTicker(time.Duration(duration) * time.Second),
f: fn,
}
}
func (tk *ticker) run() { // 实现新ticker方法-开启任务
for {
select {
case <-tk.t.C:
err := tk.f()
if err != nil {
return
}
default:
}
}
}
func (tk *ticker) stop() { // 实现新ticker方法-关闭定时器
tk.t.Stop()
}
func cronTicker() {
/**
ticker 可周期性执行
t = NewTicker 新建定时器
t.Reset(): 重置定时任务执行时间
t.C: 阻塞通道
t.stop(): 关闭ticker 还能从通道读取数据
*/
// 方式1
t := time.NewTicker(time.Second)
defer t.Stop()
counter := 0
for v := range t.C {
t.Reset(time.Second)
func(v time.Time) {
fmt.Printf("start%v-(%T)=%v\n", counter, v, v.Format("20060102-15:04:05"))
time.Sleep(time.Second * 2) // 模拟耗时
fmt.Printf("end%v-(%T)=%v\n", counter, v, v.Format("20060102-15:04:05"))
}(v)
counter++
if counter >= 4 {
break
}
}
fmt.Println("===========================================")
// 方式2
t2 := createTicker(1, func() error {
fmt.Println("running=" + time.Now().Format("20060102-15:04:05"))
return nil
})
t2.run()
defer t2.stop()
fmt.Println("程序结束...")
fmt.Println("===========================================")
}
func main() {
cronTicker()
}
cron
go get github.com/robfig/cron/[email protected]
package main
import (
"errors"
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func cronRobfig() {
/**
go get github.com/robfig/cron/[email protected]
c:=cron.New() # 新建一个定时任务调度器
c.AddFunc() # 添加一个任务
c.Start() # 定时任务开始执行
c.Stop() # 定时任务停止执行
cron表达式
Field name | Mandatory? | Allowed values | Allowed special characters
---------- | ---------- | -------------- | --------------------------
Minutes | Yes | 0-59 | * / , -
Hours | Yes | 0-23 | * / , -
Day of month | Yes | 1-31 | * / , - ?
Month | Yes | 1-12 or JAN-DEC | * / , -
Day of week | Yes | 0-6 or SUN-SAT | * / , - ?
*/
location, _ := time.LoadLocation("Asia/Shanghai")
c := cron.New(cron.WithSeconds(), cron.WithLocation(location)) // 执行时间精确到秒和时区设置
defer c.Stop()
cronStr := "*/1 * * * * ?" // 秒 分 时 日 月 周 cron表达式
c.AddFunc(cronStr, func() {
fmt.Println("1=" + time.Now().Format("20060102-15:04:05"))
}) // 添加定时任务(可多个)
c.AddFunc(cronStr, func() {
fmt.Println("2=" + time.Now().Format("20060102-15:04:05"))
})
c.Start()
entries := c.Entries()
for _, v := range entries {
fmt.Println(v.ID, v.Prev, v.Next, v.Valid(), v.Job)
//c.Remove(v.ID) // 从调度器中删除任务
}
select {} // 阻塞主线程结束
}
func main() {
cronRobfig()
}
文档
[1] https://studygolang.com/pkgdoc
[2] https://pkg.go.dev/search?q=cron
标签:fmt,cron,Println,任务,func,time,go,定时 From: https://www.cnblogs.com/fsh19991001/p/17742086.html