Go语言实现定时任务

Go语言实现定时任务,第1张

package main

import (
	"github.com/robfig/cron"
	"sync"
	"time"
)

var mutex sync.Mutex

// 任务列表
var taskList []timeTask

// 初始化并启动定时任务
func InitProcessTimer() {
	c := cron.New()
	c.AddFunc("@every 2S", ProcessTimerTaskHandler)
	c.Start()
}

// 定时要执行的回调函数
type ProcessTimerCallback func(id string, err error) error

// 定时任务类
type timeTask struct {
	id      string
	create  time.Time
	timeOut time.Duration
	cb      ProcessTimerCallback
}

// 插入定时任务
func InserTimerTask(id string, timeout time.Duration, cb ProcessTimerCallback) {
	var task timeTask
	task.id = id
	task.create = time.Now()
	task.timeOut = timeout
	task.cb = cb

	mutex.Lock()
	defer mutex.Unlock()

	for i := 0; i < len(taskList); i++ {
		// 如果id存在,只刷新创建时间和超时时间
		if taskList[i].id == task.id {
			taskList[i].create = task.create
			taskList[i].timeOut = task.timeOut
			return
		}
	}

	// 如果id不存在。增加一个task
	taskList = append(taskList, task)
}

//删除定时任务
func RemoveTimeTask(id string) {
	mutex.Lock()
	defer mutex.Unlock()

	for i := 0; i < len(taskList); i++ {
		if taskList[i].id == id {
			taskList = append(taskList[:i], taskList[i+1:]...)
			return
		}
	}
}

// 定时处理让任务
func ProcessTimerTaskHandler() {
	var task timeTask
	mutex.Lock()
	defer mutex.Unlock()

	if len(taskList) == 0 {
		return
	}

	for i := 0; i < len(taskList); {
		task = taskList[i]
		if time.Now().Sub(task.create) > task.timeOut {
			// 执行回调函数
			task.cb(task.id, nil)
			// 删除定时任务
			taskList = append(taskList[:i], taskList[i+1:]...)
		} else {
			i++
		}
	}
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/989667.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存