Go语言实现定时任务

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++
		}
	}
}


版权声明:本文为yanghaitao5000原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。