前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go定时任务cron执行不成功?你可能需要看一下这篇文章

Go定时任务cron执行不成功?你可能需要看一下这篇文章

作者头像
用户1392128
发布2024-01-08 17:52:25
2950
发布2024-01-08 17:52:25
举报
背景描述

碰到一个需求,需要起一个定时任务,由于最近在熟悉go语言,所以想用go来实现这个需求。

搜索go定时任务框架,官方推荐的框架是cron,文档地址是https://godoc.org/github.com/robfig/cron

官方示例如下

Usage Callers may register Funcs to be invoked on a given schedule. Cron will run them in their own goroutines.

代码语言:javascript
复制
c := cron.New()
c.AddFunc("30 * * * *", func() { fmt.Println("Every hour on the half hour") })
c.AddFunc("30 3-6,20-23 * * *", func() { fmt.Println(".. in the range 3-6am, 8-11pm") })
c.AddFunc("CRON_TZ=Asia/Tokyo 30 04 * * *", func() { fmt.Println("Runs at 04:30 Tokyo time every day") })
c.AddFunc("@hourly",      func() { fmt.Println("Every hour, starting an hour from now") })
c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty, starting an hour thirty from now") })
c.Start()
..
// Funcs are invoked in their own goroutine, asynchronously.
...
// Funcs may also be added to a running Cron
c.AddFunc("@daily", func() { fmt.Println("Every day") })
..
// Inspect the cron job entries' next and previous run times.
inspect(c.Entries())
..
c.Stop()  // Stop the scheduler (does not stop any jobs already running).
问题描述

按照官方示例,写了以下demo,测试定时任务是否可以运行成功

代码语言:javascript
复制
package main

import (
	"fmt"

	"github.com/robfig/cron/v3"
)

func main() {
	// 每隔3秒执行一次:*/3 * * * * *
	spec := "*/3 * * * * *"
	c := cron.New()
	c.AddFunc(spec, func() {
		fmt.Println("每隔3秒执行一次")
	})
	go c.Start()
	defer c.Stop()
	select {}
}

注释: select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。 select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的。 参考https://www.runoob.com/go/go-select-statement.html

运行上述代码,发现定时任务并没有每隔3s打印输出一次 crond 表达式是参考: https://www.cnblogs.com/linjiqin/p/3178452.html https://www.jianshu.com/p/2fafcc32561f

在这里插入图片描述
在这里插入图片描述
解决方案

这是因为"github.com/robfig/cron/v3"与"github.com/robfig/cron"包的差异造成的,实际上在v3的文档中有以下描述

Since adding Seconds is the most common modification to the standard cron spec, cron provides a builtin function to do that, which is equivalent to the custom parser you saw earlier, except that its seconds field is REQUIRED:

代码语言:javascript
复制
cron.New(cron.WithSeconds())

说明cron v3版本默认已经不再是支持到秒级别的定时了。

解决方案一:

使用老版本的cron包

代码语言:javascript
复制
package main

import (
	"fmt"

	"github.com/robfig/cron"
)

func main() {
	// 每隔3秒执行一次:*/3 * * * * *
	spec := "*/3 * * * * *"
	c := cron.New()
	c.AddFunc(spec, func() {
		fmt.Println("每隔3秒执行一次")
	})
	go c.Start()
	defer c.Stop()
	select {}
}
在这里插入图片描述
在这里插入图片描述
解决方案二:

使用新版本的cron包,但是要cron.New(cron.WithSeconds())方法

代码语言:javascript
复制
package main

import (
	"fmt"

	"github.com/robfig/cron/v3"
)

func main() {
	// 每天凌晨0点执行一次:0 0 0 * * ?
	// 每隔3秒执行一次:*/3 * * * * *
	// spec := "*/3 * * * * *"

	spec := "* * * * *"
	c := cron.New(cron.WithSeconds())
	c.AddFunc(spec, func() {
		fmt.Println("execute")
	})
	go c.Start()
	defer c.Stop()
	select {}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景描述
  • 问题描述
  • 解决方案
    • 解决方案一:
      • 解决方案二:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档