美文网首页
go 定时任务库 cron

go 定时任务库 cron

作者: wayyyy | 来源:发表于2022-05-02 00:04 被阅读0次

    工作需要使用定时任务,比如每隔一段时间统计以下文件个数和流量等等。需要做些定时任务,于是采用了 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()
    }
    

    相关文章

      网友评论

          本文标题:go 定时任务库 cron

          本文链接:https://www.haomeiwen.com/subject/oelpyrtx.html