Go编写定时器与定时任务详解(附第三方库gocron用法)

 更新时间:2022年07月14日 15:03:34   作者:太阳上的雨天  
当需要每天执行定时任务的时候就需要定时器来处理了,周期任务,倒计时任务,定点任务等,下面这篇文章主要给大家介绍了关于Go编写定时器与定时任务的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

Go 编写定时器和定时任务

在 项目开发当中,可能会遇到这样的场景:

1 A任务需要在多久之后执行一次(定时器)

2.B任务需要每隔多长时间执行一次 (定时任务)

谈到定时任务,离不开linux的crontab. 先简单了解下crontab

// 每隔1秒执行一次
*/1 * * * * ?

// 每隔1分钟执行一次
0 */1 * * * ?

// 每天0点执行一次
0 0 0 * * ?

// 每月1号凌晨1点执行一次
0 0 1 1 * ?

// 在1分、2分、3分执行一次
0 1,2,3 * * * ?

// 每天的0点、1点、2点执行一次
0 0 0,1,2 * * ?

使用crontab实现定时器和定时任务也可以,但是crontab默认只能精确到分钟, 如果想要精确到秒可以使用for循环处理秒级人物

* * * * * for i in $(seq 1 11); do echo test >> /etc/demo/demo.txt; sleep 1; done

本文简单介绍下go 实现定时器和定时任务的用法以及简单介绍一个第三方库gocron的用法

Timer

1 timer实现定时器 (延迟执行), 这个定时器只会触发一次.

使用于场景1(当然如果把下面的代码写在一个for循环中也可以实现定时任务)

Demo:

package main

import (
	"fmt"
	"time"
)

func main() {
	t := time.NewTimer(1 * time.Second)
	<-t.C
	fmt.Println("1 s 时间到")

}

结果:

1 s 时间到

2 停止定时器

使用time.Stop() 停止定时器

? 通过向通道发送一个信号,通知定时器是否关闭

Demo:

package main

import (
	"fmt"
	"time"
)

func test12(ch chan int) bool {
	timer := time.NewTimer(1 * time.Second)

	select {
	case <-ch:
		if timer.Stop() {
			fmt.Println("关闭定时器")
		}
		return true
	default:
		fmt.Println("继续执行定时器")
		return true
	}
}

func main() {

	ch := make(chan int, 1)
	// ch <- 1

	go test12(ch)

	for {

	}
}

结果:

继续执行定时器

重置定时器

Demo:

func main() {
	// 创建一个一个定时器
	fmt.Println("定时器开始")
	myT := time.NewTimer(7 * time.Second) // 设置7秒后执行一次

	// 重置定时器为 1s后执行
	myT.Reset(1 * time.Second)
	<-myT.C
	fmt.Println(" 1 s 时间到 ", time.Now().Unix())

	for {
	}
}

? 结果:

定时器开始
 1 s 时间到  1648268475

Ticker

Ticker也是定时器,它是一个周期性的定时器 使用场景2

设置3秒执行一次Demo

package main

import (
	"fmt"
	"time"
)

func main() {

	ticker := time.NewTicker(3 * time.Second)
	defer ticker.Stop()

	for range ticker.C {
		fmt.Println("执行的业务逻辑")
	}
}

结果:

ticker ticker ticker ...
ticker ticker ticker ...
ticker ticker ticker ...

gocron

一个第三方库实现定时任务 场景2

安装

go get -u github.com/go-co-op/gocron
s := gocron.NewScheduler(time.UTC)
s.Every(5).Seconds().Do(func(){ ... }) 
s.Every("5m").Do(func(){ ... })
s.Every(5).Days().Do(fu
s.Every(1).Month(1, 2, 3).Do(func(){ ... })
s.Every(1).Day().At("10:30").Do(func(){ ... })
s.Every(1).Day().At("10:30;08:00").Do(func(){ ... })
s.Every(1).Day().At("10:30").At("08:00").Do(func(){ ... })
s.Every(1).MonthLastDay().Do(func(){ ... })
s.Every(2).MonthLastDay().Do(func(){ ... })
s.Cron("*/1 * * * *").Do(task) 
s.StartAsync()
s.StartBlocking()

Demo

package main

import (
	"fmt"
	"time"

	"github.com/go-co-op/gocron"
)

func cron1() {
	fmt.Println("cron1")
}

func cron2() {
	fmt.Println("cron2")
}

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

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

	// 每秒执行一次
	s.Every(1).Second().Do(func() {
		go cron2()
	})

	s.StartBlocking()
}

结果:

cron2
cron1
cron1
cron2
cron1
cron2
cron1
cron2

总结

到此这篇关于Go编写定时器与定时任务的文章就介绍到这了,更多相关Go定时器与定时任务内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • Go语言map元素的删除和清空

    Go语言map元素的删除和清空

    本文主要介绍了Go语言map元素的删除和清空,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go 如何基于IP限制HTTP访问频率的方法实现

    Go 如何基于IP限制HTTP访问频率的方法实现

    这篇文章主要介绍了Go 如何基于IP限制HTTP访问频率的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • go语言reflect.Type?和?reflect.Value?应用示例详解

    go语言reflect.Type?和?reflect.Value?应用示例详解

    这篇文章主要为大家介绍了go语言reflect.Type?和?reflect.Value?应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 使用Go语言实现Yaml编码和解码的方法详解

    使用Go语言实现Yaml编码和解码的方法详解

    在这篇文章中,我们将介绍如何使用Go语言编写代码来实现Yaml编码和解码,文中有详细的代码示例供大家参考,对大家的学习和工作有一定的帮助,需要的朋友可以参考下
    2023-11-11
  • Go与C语言的互操作实现

    Go与C语言的互操作实现

    在Go与C语言互操作方面,Go更是提供了强大的支持。尤其是在Go中使用C,你甚至可以直接在Go源文件中编写C代码,本文就详细的介绍一下如何使用,感兴趣的可以了解一下
    2021-12-12
  • go本地环境配置及vscode go插件安装的详细教程

    go本地环境配置及vscode go插件安装的详细教程

    这篇文章主要介绍了go本地环境配置及vscode go插件安装的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Golang接口的定义与空接口及断言的使用示例

    Golang接口的定义与空接口及断言的使用示例

    在?Golang?中,接口是一种类型,它是由一组方法签名组成的抽象集合。这篇文章主要为大家介绍了Golang接口的具体使用,希望对大家有所帮助,空接口是特殊形式的接口类型,普通的接口都有方法,而空接口没有定义任何方法口,也因此,我们可以说所有类型都至少实现了空接口
    2023-04-04
  • go?micro微服务框架项目搭建方法

    go?micro微服务框架项目搭建方法

    这篇文章主要为大家介绍了go?micro微服务框架项目搭建方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 详解Golang如何优雅判断interface是否为nil

    详解Golang如何优雅判断interface是否为nil

    这篇文章主要为大家详细介绍了Golang如何优雅判断interface是否为nil的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解下
    2024-01-01
  • golang中context使用小结

    golang中context使用小结

    本文主要介绍了golang中context使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11

最新评论

?


http://www.vxiaotou.com