Golang 定时任务(cron)

在服务端开发中,定时任务是常见的需求。本文介绍了Go中的robfig/cron库,它支持cron表达式,但可能引发并发执行问题。为解决此问题,作者参照Java的Spring Schedule,实现了一个Go的Cron库,支持Cron、FixedDelay和FixedRate三种模式,并提供了github地址供测试使用。

定时任务

服务端经常会有后台定时任务的需求,最近公司在将部分服务改造为Go实现,Go有一个robfig/cron的实现,只支持cron表达式。他后台的运行模式是当有一任务达到执行时间则启动一个协程来执行任务,只要到达了执行时间不管上一次任务执行是否完成都会在启动一个协程执行这个任务,假设我这里有一个任务是一分钟执行一次,但是任务执行时间不是很确定可能在一分钟内结束也可能超过一分钟,那么就有可能出现一个任务被多个协程执行的并发问题。用过Java的人一定知道spring schedule,它支持Cron表达式、FixedDelay、FixedRate的三种模式,Cron跟Go的robfig/cron实现是一样的,FixedDelay则是当前任务执行完再开始延迟一定时间执行下一次任务,FixedRate则是当前任务开始执行则开始计时下一次任务,但是如果当前任务执行时间超过了任务该执行的时间也要等到当前任务执行完才执行,更细节的解释可以参考这篇文章原理暂且不谈,定时器你当真会用。所以我这里参考Java的实现,实现了Go的Cron,它支持Cron表达式、FixedDelay、FixedRate的三种模式。github地址 go-cron。有需求的可以拉下来测试测试,目前发布了一个1.0.0的beta版

example

import "github.com/wangbaolong/go-cron/cron"
var schedule = cron.NewSchedule()
    schedule.Schedule("Scheduled", 300, func() {
                logger.Info("A task exec")
    })

    schedule.ScheduleAtFixedRate("ScheduleAtFixedRate", 5, 5, func() {
        logger.Info("B task running spend time 10s")
        time.Sleep(time.Second * 10)
    })

    schedule.ScheduleWithFixedDelay("ScheduleWithFixedDelay", 5, 5, func() {
        logger.Info("C task running spend time 10s")
        time.Sleep(time.Second * 10)
    })

    _ = schedule.ScheduleWithSpec("specTask", "*/20 * * * * *", func() {
        logger.Info("D task running spend time 2min")
        time.Sleep(time.Minute * 2)
    })

    _ = schedule.ScheduleWithSpec("specTask", "@every 10s", func() {
        logger.Info("E task running spend time 2min")
        time.Sleep(time.Minute * 2)
    })

    // schedule.ShutdownNow()
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值