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++
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)