高级排程
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
2.1 KiB

package service
import (
"container/list"
)
/**调度事件队列,基于调度时间排序**/
// 调度任务队列对象
type SchedQueue struct {
taskList *list.List
}
// 初始化构造一个新的任务队列对象
func NewSchedQueue() *SchedQueue {
return &SchedQueue{
taskList: list.New(),
}
}
// 返回队列存储的节点数量
func (q *SchedQueue) Length() int {
return q.taskList.Len()
}
// 将元素从队列尾部加入队列
func (q *SchedQueue) AddBack(event SchedEvent) {
q.taskList.PushBack(event)
}
// 将元素从队列头部加入队列
func (q *SchedQueue) AddFront(event SchedEvent) {
q.taskList.PushFront(event)
}
// 基于时间点将元素插入队列
func (q *SchedQueue) Insert(event SchedEvent) {
var(
elem *list.Element
et SchedEvent
prioEvent, prioElem int
binsert bool
)
// 从头遍历,比较时间并插入
binsert = false
for elem = q.taskList.Front(); elem != nil; elem = elem.Next() {
et = (elem.Value).(SchedEvent)
// 时间时间点早于比较时间的时间点,则插入到其前方
if event.GetEventTime().Unix() < et.GetEventTime().Unix() {
q.taskList.InsertBefore(event, elem)
binsert = true
break
}
// 如果相等,则比较事件对象的优先级,优先级高则插入
if event.GetEventTime().Unix() == et.GetEventTime().Unix() {
prioEvent = GetSchedEventTypePriority(event.GetEventType())
prioElem = GetSchedEventTypePriority(et.GetEventType())
if prioEvent > prioElem{
q.taskList.InsertBefore(event, elem)
binsert = true
break
}
}
}
// 没有找到插入点,则默认插入到队列尾部
if !binsert {
q.AddBack(event)
}
return
}
// 返回队头元素,但元素不出队
func (q *SchedQueue) Front() (event *SchedEvent) {
if q.Length() > 0 {
elem := q.taskList.Front()
res := (elem.Value).(SchedEvent)
event = &res
return
}else{
return nil
}
}
// 返回队头元素,元素出队
func (q *SchedQueue) Pop() (event SchedEvent) {
if q.Length() > 0 {
elem := q.taskList.Front()
event = (elem.Value).(SchedEvent)
q.taskList.Remove(elem)
return
}else{
return nil
}
}