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
  • 相关阅读:
    CentOS7.6下 MariaDB的MHA 集群搭建(一)
    Mariadb10.4 集群压力测试(一)
    Galera 核心参数详解(一)
    Mariadb10.4+ ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
    手动打造一个弹窗程序
    IAT HOOK
    进制的本质
    基于数组越界的缓冲区溢出
    函数调用堆栈图-c语言
    算法之二分查找(上)-c语言实现
  • 原文地址:https://www.cnblogs.com/sunlong88/p/11285947.html
Copyright © 2011-2022 走看看