zoukankan      html  css  js  c++  java
  • cronexpr任务调度

    package main
    
    import (
        "github.com/gorhill/cronexpr"
        "fmt"
        "time"
    )
    
    
    
    func main(){
        var(
            expr *cronexpr.Expression
            err error
            now time.Time
            nextTime time.Time
        )
    
        //if expr,err = cronexpr.Parse("* * * * *");err != nil{
        //    fmt.Println(err)
        //    return
        //}
        //expr = expr
    
        if expr,err = cronexpr.Parse("* * * * *");err !=nil{
            fmt.Println(err)
            return
        }
        expr = expr
    
        now = time.Now()
        nextTime = expr.Next(now)
        fmt.Println(now,nextTime)
    
    
        time.AfterFunc(nextTime.Sub(now), func() {
            fmt.Println("被调度了:",nextTime)
        })
    
        time.Sleep(50*time.Second)
    }
    2019-08-01 23:00:25.7892266 +0800 CST m=+0.017000401 2019-08-01 23:01:00 +0800 CST
    被调度了: 2019-08-01 23:01:00 +0800 CST
    
    Process finished with exit code 0

     调度多个cron任务

    package main
    
    import (
        "github.com/gorhill/cronexpr"
        "fmt"
        "time"
    )
    //代表一个任务
    type CronJob struct {
        expr *cronexpr.Expression
        nextTime time.Time//expr.Next(Now)
    }
    
    
    func main(){
        //需要有一个调度协程  它定时检查所有的cron任务 谁过期就执行谁
        var(
            expr *cronexpr.Expression
            now time.Time
            cronJob *CronJob
            scheduleTable map[string]*CronJob //key:任务名字
        )
    
        scheduleTable = make(map[string]*CronJob)
    
        now = time.Now()
    
        //1定义两个cronjob
        expr = cronexpr.MustParse("*/5 * * * * * *")
        cronJob = &CronJob{
            expr:expr,
            nextTime:expr.Next(now),
        }
    
        scheduleTable["job1"] = cronJob
    
        expr = cronexpr.MustParse("*/5 * * * * * *")
        cronJob = &CronJob{
            expr:expr,
            nextTime:expr.Next(now),
        }
    
        scheduleTable["job2"] = cronJob
    
        go func() {
            var(
                jobName string
                cronJob *CronJob
                now time.Time
            )
            //定时检查一下任务调度表
            for{
                now = time.Now()
                for jobName ,cronJob = range scheduleTable{
                    if cronJob.nextTime.Before(now) || cronJob.nextTime.Equal(now){
                        go func(jobName string) {
                            fmt.Println("执行:",jobName)
                        }(jobName)
                        cronJob.nextTime = cronJob.expr.Next(now)
                        fmt.Println("下次执行时间:",cronJob.nextTime)
                    }
                }
    
                //睡眠100毫秒
                select {
                    case <-time.NewTimer(100*time.Millisecond).C://1将在100毫秒可读 返回
    
                }
            }
        }()
    
        time.Sleep(time.Second*100)
    
    }
    下次执行时间: 2019-08-03 14:44:15 +0800 CST
    下次执行时间: 2019-08-03 14:44:15 +0800 CST
    执行: job2
    执行: job1
    下次执行时间: 2019-08-03 14:44:20 +0800 CST
    下次执行时间: 2019-08-03 14:44:20 +0800 CST
    执行: job2
    执行: job1
    下次执行时间: 2019-08-03 14:44:25 +0800 CST
    下次执行时间: 2019-08-03 14:44:25 +0800 CST
    执行: job1
    执行: job2
    下次执行时间: 2019-08-03 14:44:30 +0800 CST
    执行: job1
    执行: job2
    下次执行时间: 2019-08-03 14:44:30 +0800 CST
    下次执行时间: 2019-08-03 14:44:35 +0800 CST
    下次执行时间: 2019-08-03 14:44:35 +0800 CST
    执行: job1
    执行: job2
    下次执行时间: 2019-08-03 14:44:40 +0800 CST
    执行: job2
    下次执行时间: 2019-08-03 14:44:40 +0800 CST
    执行: job1
  • 相关阅读:
    ActivityLifecycleCallbacks 如何控制activity的生命周期
    ViewPage + Fragment 防止Fragment 重复加载问题
    RecyclerView 必知必会(转)
    如何简单的实现一个tab页title的动画效果
    onInterceptTouchEvent和onTouchEvent调用时序(转)
    Android Studio 2.3版本 Run项目不能自动启动APP的问题 (转)
    js-jQuery性能优化(一)
    js-权威指南学习笔记20
    js-权威指南学习笔记19.2
    js-权威指南学习笔记19
  • 原文地址:https://www.cnblogs.com/sunlong88/p/11285947.html
Copyright © 2011-2022 走看看