52 lines
1.9 KiB
Go
52 lines
1.9 KiB
Go
|
// Package task ...
|
|||
|
//
|
|||
|
// Description : task ...
|
|||
|
//
|
|||
|
// Author : go_developer@163.com<白茶清欢>
|
|||
|
//
|
|||
|
// Date : 2023-08-04 11:13
|
|||
|
package task
|
|||
|
|
|||
|
import (
|
|||
|
"container/list"
|
|||
|
"git.zhangdeman.cn/zhangdeman/easymap"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
// TimeWheel 核心时间轮的数据结构
|
|||
|
//
|
|||
|
// Author : go_developer@163.com<白茶清欢>
|
|||
|
//
|
|||
|
// Date : 11:14 2023/8/4
|
|||
|
type TimeWheel struct {
|
|||
|
Interval time.Duration // 时间轮精度
|
|||
|
Slots []*list.List // 时间轮盘每个位置存储的任务列表
|
|||
|
Ticker *time.Ticker // 定时器
|
|||
|
CurrentPosition int // 时间轮盘当前位置
|
|||
|
SlotCount int // 时间轮盘的齿数,Interval*SlotCount就是时间轮盘转一圈走过的时间
|
|||
|
AddTaskChannel chan *Task
|
|||
|
RemoveTaskChannel chan *Task
|
|||
|
StopChannel chan bool
|
|||
|
TaskRecords easymap.EasyMap // Map结构来存储Task对象,key是Task.key,value是Task在双向链表中的存储对象
|
|||
|
// 需要执行的任务,如果时间轮盘上的Task执行同一个Job,可以直接实例化到TimeWheel结构体中。
|
|||
|
// 此处的优先级低于Task中的Job参数
|
|||
|
Job ITask
|
|||
|
IsRunning bool // 是否运行中
|
|||
|
}
|
|||
|
|
|||
|
// Task 任务数据结构
|
|||
|
//
|
|||
|
// Author : go_developer@163.com<白茶清欢>
|
|||
|
//
|
|||
|
// Date : 11:44 2023/8/4
|
|||
|
type Task struct {
|
|||
|
Key string // 用来标识task对象,是唯一的
|
|||
|
Interval time.Duration // 任务周期
|
|||
|
CreatedTime time.Time // 任务的创建时间
|
|||
|
Position int // 任务在轮盘的位置
|
|||
|
Circle int // 任务需要在轮盘走多少圈才能执行
|
|||
|
Job ITask // 任务需要执行的Job,优先级高于TimeWheel中的Job
|
|||
|
Times int // 任务需要执行的次数,如果需要一直执行,设置成-1
|
|||
|
MaxExecuteTime int64 // 最大执行时长, 超时自动取消. 如不限制时长, 设置成0
|
|||
|
}
|