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/v3@v3.0.0
package main

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

func cronRobfig() {
	/**
	go get github.com/robfig/cron/v3@v3.0.0
	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

posted @   爱编程_喵  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
jQuery火箭图标返回顶部代码

jQuery火箭图标返回顶部代码

滚动滑动条后,查看右下角查看效果。很炫哦!!

适用浏览器:IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗.

点击右上角即可分享
微信分享提示