golang 实现定时任务
golang 实现定时任务
背景
开发的时候经常会遇到做一些周期性重复性的工作。比如最近的项目中遇到,每周都需要去数据库中清理用户的免费金额额度,每月都要清理用户的账户余额等。如果在逻辑中时间优点过于麻烦,决定尝试使用定时任务来进行操作。
1. 定时任务库选择
目前比较主流的两种go常用的定时库
-
robfig/cron:说到定时任务,会想到
crontab,其常见于Unix和类Unix的操作系统之中。robfig/cron 库使用了类 crontab 的方式来执行定时任务。 -
jasonlvhit/gocron:类 crontab 的设置方式可能并不友好,jasonlvhit/gocron 提供了更为人性化的执行方式。
gocron
这里我们直接学习推荐的开源库:gocron
安装库:go get -u github.com/jasonlvhit/gocron
1. demo : 实现一个每隔 5 秒的定时任务
package main
import (
"fmt"
"time"
"github.com/jasonlvhit/gocron"
)
func task() {
fmt.Println("task 被执行一次", time.Now().Format("2001-01-02 03:04:05"))
}
func main() {
// 每五秒运行一次 task
// 申请一个调度器
s := gocron.NewScheduler()
s.Every(3).Seconds().Do(task)
<-s.Start()
}
2. 更多详细用法
https://github.com/jasonlvhit/gocron
更多丰富的用法参考官网的 API 即可,API 写的比较通俗易懂这里就不做过多赘述了。
package main
import (
"fmt"
"time"
"github.com/jasonlvhit/gocron"
)
func task() {
fmt.Println("I am running task.")
}
func taskWithParams(a int, b string) {
fmt.Println(a, b)
}
func main() {
// Do jobs without params
gocron.Every(1).Second().Do(task)
gocron.Every(2).Seconds().Do(task)
gocron.Every(1).Minute().Do(task)
gocron.Every(2).Minutes().Do(task)
gocron.Every(1).Hour().Do(task)
gocron.Every(2).Hours().Do(task)
gocron.Every(1).Day().Do(task)
gocron.Every(2).Days().Do(task)
gocron.Every(1).Week().Do(task)
gocron.Every(2).Weeks().Do(task)
// Do jobs with params
gocron.Every(1).Second().Do(taskWithParams, 1, "hello")
// Do jobs on specific weekday
gocron.Every(1).Monday().Do(task)
gocron.Every(1).Thursday().Do(task)
// Do a job at a specific time - 'hour:min:sec' - seconds optional
gocron.Every(1).Day().At("10:30").Do(task)
gocron.Every(1).Monday().At("18:30").Do(task)
gocron.Every(1).Tuesday().At("18:30:59").Do(task)
// Begin job immediately upon start
gocron.Every(1).Hour().From(gocron.NextTick()).Do(task)
// Begin job at a specific date/time
t := time.Date(2019, time.November, 10, 15, 0, 0, 0, time.Local)
gocron.Every(1).Hour().From(&t).Do(task)
// NextRun gets the next running time
_, time := gocron.NextRun()
fmt.Println(time)
// Remove a specific job
gocron.Remove(task)
// Clear all scheduled jobs
gocron.Clear()
// Start all the pending jobs
<- gocron.Start()
// also, you can create a new scheduler
// to run two schedulers concurrently
s := gocron.NewScheduler()
s.Every(3).Seconds().Do(task)
<- s.Start()
}

浙公网安备 33010602011771号