工作需要使用定时任务,比如每隔一段时间统计以下文件个数和流量等等。需要做些定时任务,于是采用了 github.com/robfig/cron这个库
package main
import (
"fmt"
"github.com/robfig/cron"
"time"
)
var JobSpec = "@every 10s"
type TaskDemo struct {
taskName string
schedule cron.Schedule
}
func (task TaskDemo) Run() {
fmt.Println(fmt.Sprintf("now: %d, %s run, next run %d", time.Now().Unix(), task.taskName, task.schedule.Next(time.Now()).Unix()))
}
func StartTaskDemoJob() error {
schedule, err := cron.Parse(JobSpec)
if err != nil {
fmt.Println("cron Parse failed, error with", err.Error())
return err
}
crontab := cron.New()
taskDemo := TaskDemo{
taskName: "taskDemo",
schedule: schedule,
}
err = crontab.AddJob(JobSpec, taskDemo)
if err != nil {
fmt.Println("cron add failed, error with", err.Error())
return err
}
crontab.Start()
}
func main() {
StartTaskDemoJob()
select {
}
}
输出:
image.png
实际上线使用发现,run
中花费的时间很长的话,比如大于定时任务间隔时间,就会启很多的协程,如果要求每个定时任务必须执行完了之后,才能执行下一次任务的话,那么可以简单使用锁来解决:
var isCheckTaskRunning = false
var isCheckTaskRunningLock sync.Mutex
func (task TaskDemo) Run() {
isCheckTaskRunning.Lock()
if isCheckTaskRunning {
isCheckTaskRunning.UnLock()
return
}
isCheckTaskRunning = true
isCheckTaskRunning.UnLock()
fmt.Println(fmt.Sprintf("now: %d, %s run, next run %d", time.Now().Unix(), task.taskName, task.schedule.Next(time.Now()).Unix()))
isCheckTaskRunning.Lock()
isCheckTaskRunning = false
isCheckTaskRunning.UnLock()
}
网友评论