[golang]使用gocron编写定时任务

前言

linux自带的crontab默认情况下只能精确到分钟,没法执行秒级任务。当然,也不是不行,比如:

* * * * * for i in $(seq 1 11);do echo hello >> /home/heruos/tmp.txt;sleep 5;done

看起来low了点,但也不是不能用。本文推荐go的一个第三方模块——gocron,配置定时任务也相当简单。

  • 安装
go get -u github.com/go-co-op/gocron

基础使用示例

package main

import (
	"fmt"
	"time"
	"github.com/go-co-op/gocron"
)

func cron1() {
	fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
}

func main() {
	timezone,_ := time.LoadLocation("Asia/Shanghai")
	s := gocron.NewScheduler(timezone)

	// 每3秒执行一次
	s.Every(3).Seconds().Do(cron1)

	s.StartBlocking()
}

定时示例

// 每5秒执行一次
s.Every(5).Seconds().Do(func(){ ... })

// 每5天执行
s.Every(5).Days().Do(func(){ ... })

// 解析字符串。每5秒执行
s.Every("5s").Do(cron2)

// 每月1号、2号和3号的10:00执行一次
s.Every(1).Month(1,2,3).At("10:00").Do(func(){ ... })

// 每天10:30执行一次
s.Every(1).Day().At("10:30").Do(func(){ ... })

// 每天10:30和08:00执行一次
s.Every(1).Day().At("10:30;08:00").Do(func(){ ... })

// 解析crontab表达式,每分钟执行一次
s.Cron("* * * * *").Do(func(){ ... })

启动方式

启动scheduler有两种方式:

  • s.StartAsync():异步调用,适合集成到其它系统。
  • s.StartBlocking():阻塞调用,适合单纯的定时任务场景。

参考

相关文章

简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。...
使用gin框架编写服务端应用,配置路由接收websocket请求并处...
## 前言 linux自带的crontab默认情况下只能精确到分钟,没法...
前言 代码参考自《Building Distributed Application in Gin...
前言 通过钉钉群机器人的webhook,实现消息推送。 本文代码仅...
golang-jwt是go语言中用来生成和解析jwt的一个第三方库,早先...