栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

Go语言实现定时任务

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/902594.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号