首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何定期启动cron作业,从过去的某个时间开始

如何定期启动cron作业,从过去的某个时间开始
EN

Stack Overflow用户
提问于 2020-03-25 07:41:35
回答 2查看 592关注 0票数 0

我想要建立一个程序,运行一些cron的工作,这些工作开始于一个时间,一般,在过去。下面是一个使用gocron的简化示例

代码语言:javascript
运行
复制
package main

import (
    "time"

    "github.com/jasonlvhit/gocron"
    "github.com/sirupsen/logrus"
)

// This slice would be obtained from persistent storage
var startTimes = []time.Time{
    time.Now().Add(-4 * time.Second),
    time.Now().Add(-3 * time.Second),
}

func format(t time.Time) string {
    return t.Format("15:04:05")
}

func notify(startTime time.Time) {
    logrus.WithField("time", format(time.Now())).Infof("I started at %s\n", format(startTime))
}

func main() {
    for _, startTime := range startTimes {
        gocron.Every(10).Seconds().From(&startTime).Do(notify, startTime)
    }

    logrus.Infof("Starting at %s...\n", format(time.Now()))
    <-gocron.Start()
}

如果运行此操作,将得到以下输出:

代码语言:javascript
运行
复制
INFO[0000] Starting at 00:30:54...                      
INFO[0010] I started at 00:30:50                         fields.time="00:31:04"
INFO[0010] I started at 00:30:51                         fields.time="00:31:04"

我所观察到的是,所有的事件都发生在一次,10秒后,我启动程序。

但是,由于startTime是程序启动前的4秒和3秒,我想要的是在程序启动后6秒和7秒发生事件(在此之后分别每10秒发生一次)。

有什么方法可以用gocron或其他工具来完成吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-25 14:57:57

这似乎只是简单的数学:

代码语言:javascript
运行
复制
    interval := 10 * time.Second
    nextTime := time.Now().Add((time.Since(startTime) + interval) % interval)
    gocron.Every(10).Seconds().From(&nextTime).Do(notify, nextTime)

https://play.golang.org/p/pwEZqy_LUuk

票数 1
EN

Stack Overflow用户

发布于 2020-03-25 08:33:07

我们可以尝试利用一个简单的代码,它不是一个完整的解决方案,但应该足够容易适应。

代码语言:javascript
运行
复制
package main

import (
    "fmt"
    "time"
)

func ticker(period time.Duration, length ...time.Duration) <-chan time.Time {
    ticker := time.NewTicker(period)

    if len(length) > 0 {
        done := make(chan bool)
        go func() {
            time.Sleep(period + length[0])
            done <- true
        }()

        go func() {
            <-done
            ticker.Stop()
        }()
    }

    return ticker.C

}

func main() {
    t1 := ticker(6*time.Second, 4*time.Second)
    t2 := ticker(7*time.Second, 3*time.Second)
    t3 := ticker(10 * time.Second)
    for {
        select {
        case t1 := <-t1:
            fmt.Println("t1: ", t1)
        case t2 := <-t2:
            fmt.Println("t2: ", t2)
        case t3 := <-t3:
            fmt.Println("t3: ", t3)
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60844625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档