Golang 使用定时任务(robfig/cron/v3)

前言

go执行定时任务,可以使用robfig/cron/v3包,robfig/cron/v3 是一个 Golang 的定时任务库,支持 cron 表达式

定时任务使用

参考文档

定时任务参考文档可以参考

arduino 复制代码
 https://pkg.go.dev/github.com/robfig/cron/v3
 

依赖安装

执行以下命令安装依赖

kotlin 复制代码
 go get github.com/robfig/cron/[email protected]
 

cron使用

每分钟执行一次

go 复制代码
package main

import (
   "github.com/robfig/cron/v3"
   "log"
   "time"
)

func TestCron() {
   c := cron.New()
   i := 1
   _, err := c.AddFunc("* * * * *", func() {
      log.Println("数据为: ", i)
      i++
   })
   if err != nil {
      return
   }
   c.Start()
   time.Sleep(time.Minute * 5)
}
func main() {
   TestCron()
}

输出结果

corn支持秒

精确到秒的 Cron 表达式

Cron v3 版本的表达式从六个参数调整为五个,取消了对秒的默认支持,需要精确到秒的控制可以使用 cron.WithSeconds() 解析器

每秒执行一次

go 复制代码
package main

import (
    "github.com/robfig/cron/v3"
    "log"
    "time"
)

func TestCron() {
    c := cron.New(cron.WithSeconds())
    i := 1
    _, err := c.AddFunc("*/1 * * * * *", func() {
       log.Println("数据为: ", i)
       i++
    })
    if err != nil {
       return
    }
    c.Start()
    time.Sleep(time.Minute * 5)
}
func main() {
    TestCron()
}

输出结果为

使用@every

每10s执行一次

go 复制代码
package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
    "time"
)

func TestCron() {
    c := cron.New()
    c.AddFunc("@every 10s", func() {
       fmt.Println("Every 10 Seconds")
    })
    c.Start()

    time.Sleep(time.Minute * 5)
}
func main() {
    TestCron()
}

输出结果为

设置时区

scss 复制代码
package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
    "time"
)

func TestCron() {
    //c := cron.New()
    // 上海时区早六点
    nyc, _ := time.LoadLocation("Asia/Shanghai")
    c := cron.New(cron.WithLocation(nyc))
    c.AddFunc("@every 10s", func() {
       fmt.Println(12)
    })
    c.Start()

    time.Sleep(time.Minute * 5)
}
func main() {
    TestCron()
}

AddJob使用

go 复制代码
package main

import (
    "github.com/robfig/cron/v3"
    "log"
    "time"
)

func TestCron() {
    c := cron.New(cron.WithSeconds())

    // 上海时区早六点
    _, err := c.AddJob("*/5 * * * * *", Hello{})
    if err != nil {
       return
    }
    c.Start()

    time.Sleep(time.Minute * 5)
}

type Hello struct {
}

func (t Hello) Run() {
    log.Println("hello world")
}

func main() {
    TestCron()
}

输出结果为

终止任务

go 复制代码
package main

import (
    "github.com/robfig/cron/v3"
    "log"
    "time"
)

func TestCron() {
    c := cron.New(cron.WithSeconds())

    // 上海时区早六点
    _, err := c.AddJob("*/2 * * * * *", Hello{})
    if err != nil {
       return
    }
    c.Start()

    go func() {
       time.Sleep(5 * time.Second)
       log.Println("==============终止任务")
       c.Stop()
    }()

    time.Sleep(time.Minute * 5)
}

type Hello struct {
}

func (t Hello) Run() {
    log.Println("hello world")
}

func main() {
    TestCron()
}

输出结果为

总结

cron则提供了更强大的定时任务调度功能,适用于复杂场景。根据实际需求选择合适的方法,可以方便地实现定时任务的开发

相关推荐
炒空心菜菜10 分钟前
SparkSQL 连接 MySQL 并添加新数据:实战指南
大数据·开发语言·数据库·后端·mysql·spark
蜗牛沐雨2 小时前
Rust 中的 `PartialEq` 和 `Eq`:深入解析与应用
开发语言·后端·rust
Python私教2 小时前
Rust快速入门:从零到实战指南
开发语言·后端·rust
秋野酱3 小时前
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
java·spring boot·后端
小明.杨4 小时前
Django 中时区的理解
后端·python·django
有梦想的攻城狮4 小时前
spring中的@Async注解详解
java·后端·spring·异步·async注解
qq_12498707534 小时前
原生小程序+springboot+vue医院医患纠纷管理系统的设计与开发(程序+论文+讲解+安装+售后)
java·数据库·spring boot·后端·小程序·毕业设计
lybugproducer4 小时前
浅谈 Redis 数据类型
java·数据库·redis·后端·链表·缓存
焚 城5 小时前
.NET8关于ORM的一次思考
后端·.net
撸猫7917 小时前
HttpSession 的运行原理
前端·后端·cookie·httpsession