首页 > 其他分享 >go定时任务

go定时任务

时间:2023-10-04 12:14:42浏览次数:26  
标签:fmt cron Println 任务 func time go 定时

目录

go定时任务

Time

NewTimer

package main

import (
	"fmt"
	"time"
)


func cronTimer() {
	/**
	timer定时器 实现一些定时操作 本质通过chan阻塞实现 且只执行一次
	t:=time.NewTimer(时间): 新建定时器
	<-t.C :管道取值阻塞
	t.Stop(): 主动停止任务
	t.Reset(时间):重新设置定时任务执行时间
	*/
	// 方式1
	fmt.Println("start=", time.Now().Format("20060102-15:04:05"))
	duration := time.Second * 3
	t := time.NewTimer(duration)
	//for {
	//	t.Reset(duration) // 重设任务执行的时间间隔并复用timer
	//	select {
	//	case <-t.C: // 管道阻塞
	//		fmt.Println("running=" + time.Now().Format("20060102-15:04:05"))
	//	default:
	//		fmt.Println("blocked=" + time.Now().Format("20060102-15:04:05"))
	//		time.Sleep(duration)
	//	}
	//}
	<-t.C
	fmt.Println("end=", time.Now().Format("20060102-15:04:05")) // 原定是3秒后执行 重设reset后1秒执行
	fmt.Println("====================================================")
	fmt.Println("start=", time.Now().Format("20060102-15:04:05"))
	t2 := time.NewTimer(time.Second * 3)
	go func() {
		<-t2.C
	}()
	stopFlag := t2.Stop() // 主动停止任务
	if stopFlag {
		fmt.Println("end=", time.Now().Format("20060102-15:04:05"))
	}
	fmt.Println("====================================================")
	// 方式2
	fmt.Println("start=", time.Now().Format("20060102-15:04:05"))
	<-time.After(time.Second * 2) // 管道阻塞
	fmt.Println("end=", time.Now().Format("20060102-15:04:05"))
	fmt.Println("====================================================")
	// 方式3-带任务处理函数
	taskChan := make(chan bool, 1)
	time.AfterFunc(time.Second*3, func() {
		taskChan <- true
	})
	for {
		select {
		case <-taskChan:
			fmt.Printf("taskEnd=%s\n", time.Now().Format("20060102-15:04:05"))
			return
		default:
			fmt.Println("blocked=" + time.Now().Format("20060102-15:04:05"))
			time.Sleep(time.Second * 2)
		}
	}
}

func main() {
	cronTimer()
}

image


NewTicker

package main

import (
	"errors"
	"fmt"
	"time"
)

type taskFunc func() error // 任务函数

type ticker struct { // 重定义ticker定时器
	t *time.Ticker
	f taskFunc
}

func createTicker(duration int, fn taskFunc) *ticker { // 重写新建ticker函数
	if duration <= 0 {
		panic(errors.New("invalid duration"))
	}
	return &ticker{
		t: time.NewTicker(time.Duration(duration) * time.Second),
		f: fn,
	}
}

func (tk *ticker) run() { // 实现新ticker方法-开启任务
	for {
		select {
		case <-tk.t.C:
			err := tk.f()
			if err != nil {
				return
			}
		default:
		}
	}
}

func (tk *ticker) stop() { // 实现新ticker方法-关闭定时器
	tk.t.Stop()
}

func cronTicker() {
	/**
	ticker 可周期性执行
	t = NewTicker 新建定时器
	t.Reset(): 重置定时任务执行时间
	t.C: 阻塞通道
	t.stop(): 关闭ticker 还能从通道读取数据
	*/
	// 方式1
	t := time.NewTicker(time.Second)
	defer t.Stop()
	counter := 0
	for v := range t.C {
		t.Reset(time.Second)
		func(v time.Time) {
			fmt.Printf("start%v-(%T)=%v\n", counter, v, v.Format("20060102-15:04:05"))
			time.Sleep(time.Second * 2) // 模拟耗时
			fmt.Printf("end%v-(%T)=%v\n", counter, v, v.Format("20060102-15:04:05"))
		}(v)
		counter++
		if counter >= 4 {
			break
		}
	}
	fmt.Println("===========================================")
	// 方式2
	t2 := createTicker(1, func() error {
		fmt.Println("running=" + time.Now().Format("20060102-15:04:05"))
		return nil
	})
	t2.run()
	defer t2.stop()
	fmt.Println("程序结束...")
	fmt.Println("===========================================")
}

func main() {
	cronTicker()
}

image



cron

go get github.com/robfig/cron/[email protected]
package main

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

func cronRobfig() {
	/**
	go get github.com/robfig/cron/[email protected]
	c:=cron.New() # 新建一个定时任务调度器
	c.AddFunc() # 添加一个任务
	c.Start() # 定时任务开始执行
	c.Stop()  # 定时任务停止执行

	cron表达式
	Field name   | Mandatory? | Allowed values  | Allowed special characters
	----------   | ---------- | --------------  | --------------------------
	Minutes      | Yes        | 0-59            | * / , -
	Hours        | Yes        | 0-23            | * / , -
	Day of month | Yes        | 1-31            | * / , - ?
	Month        | Yes        | 1-12 or JAN-DEC | * / , -
	Day of week  | Yes        | 0-6 or SUN-SAT  | * / , - ?
	*/

	location, _ := time.LoadLocation("Asia/Shanghai")
	c := cron.New(cron.WithSeconds(), cron.WithLocation(location)) // 执行时间精确到秒和时区设置
	defer c.Stop()
	cronStr := "*/1 * * * * ?" // 秒 分 时 日 月 周  cron表达式

	c.AddFunc(cronStr, func() {
		fmt.Println("1=" + time.Now().Format("20060102-15:04:05"))
	}) // 添加定时任务(可多个)
	c.AddFunc(cronStr, func() {
		fmt.Println("2=" + time.Now().Format("20060102-15:04:05"))
	})
	c.Start()

	entries := c.Entries()
	for _, v := range entries {
		fmt.Println(v.ID, v.Prev, v.Next, v.Valid(), v.Job)
		//c.Remove(v.ID)  // 从调度器中删除任务
	}

	select {} // 阻塞主线程结束
}

func main() {
	cronRobfig()
}

image


文档

[1] https://studygolang.com/pkgdoc

[2] https://pkg.go.dev/search?q=cron

标签:fmt,cron,Println,任务,func,time,go,定时
From: https://www.cnblogs.com/fsh19991001/p/17742086.html

相关文章

  • django集成celery
    参考:https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html#django-first-steps这里只记录一些要注意的地方1、celery主文件importosfromceleryimportCelery#SetthedefaultDjangosettingsmoduleforthe'celery'program.#这个是导入djan......
  • Celery周期性任务定义beat
    通过celerybeat可以使用周期性任务的定义。https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html周期性任务beat相关设置:https://docs.celeryq.dev/en/stable/userguide/configuration.html#std-setting-beat_schedule您必须确保一次只运行一个beat调度程序,否......
  • django-celery-results - 使用 Django ORM/Cache 作为结果后端
    https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html#django-celery-results-using-the-django-orm-cache-as-a-result-backend这个一般自己设置一下result_backend也行,要用django-celery-results也是一个选择。......
  • django-celery-beat插件使用
    该插件从Django管理界面管理celery的定期任务,您可以在其中动态****创建、编辑和删除定期任务以及它们的运行频率。django-celery-beat提供了几种添加定时或周期性任务的方式,预先在在settings.py中添加好定时任务。通过Djangoadmin后台动态添加。(实际上就是操作model模型类)......
  • MongoDB 和 Redis 的区别
    在现代的应用程序开发中,数据库是不可或缺的组成部分。MongoDB和Redis是两种流行的数据库,它们在一些方面有相似之处,但在其他方面则有着显著的差异。下面,我们将探讨MongoDB和Redis的区别。数据模型MongoDB是一个面向文档的数据库,它存储的数据是以BSON(BinaryJSON)格式存......
  • FreeRTOS 原理 --- 软件定时器
     简介 有一个定时器任务,任务内读队列。启动定时器,会向队列发送消息,定时器任务读到消息后把定时器回调函数等信息作为一个链表项插入链表。当链表有链表项,算出还剩多长时间执行定时器回调函数,这个时间作为定时器任务阻塞时间。所以定时器任务重新运行要么是时间到准备运行定时器......
  • [SpringBoot 2] 任务 和 Dubbo+ Zookeeper
    SpringBoot_21.任务1.1异步任务:方法上添加@Async,Application方法上开启异步@EnableAsync1.2邮件任务:添加spring-boot-starter-mail在自己的邮件账户中打开POP3/SMTP协议,并获取到授权码spring.mail.host=smtp.服务器host.com(具体着相关的文档)注入JavaMailSender......
  • FreeRTOS 原理 --- 任务通知
    简介任务通知核心包含是一个32位的无符号整数和一个8位的通知状态,这两个在任务控制块中,通知任务就是一个任务或者中断改写另外一个任务中的32位的无符号整数,改写这个整数的方式可以有所不同可以让这个整数加1,模拟信号量设置该整数的指定的某些位,模拟事件组直接选择覆盖或者不......
  • Go 语言代码示例。使用并发和通道的并行计算素数的示例代码
    Go语言代码示例。使用并发和通道的并行计算素数的示例代码:packagemainimport( "fmt")funcmain(){ lowerLimit:=2 upperLimit:=100 //创建管道,用于在协程之间传递素数 primes:=make(chanint) //创建一个协程来生成素数序列 gogeneratePrimes(primes)......
  • 轻量级开源在线任务管理工具-DooTask
    项目简介DooTask是一款开源在线项目任务管理工具提供各类文档协作工具、项目提供在线思维导图、在线流程图、项目管理、任务分发、即时IM,文件管理等工具。官网:DooTask源码地址GithubGitee功能特色高效便捷的团队沟通工具针对项目和任务建立群组,工作问题可及时沟通,促进团队快速协作......