高级排程
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

  1. package service
  2. import (
  3. "container/list"
  4. )
  5. /**调度事件队列,基于调度时间排序**/
  6. // 调度任务队列对象
  7. type SchedQueue struct {
  8. taskList *list.List
  9. }
  10. // 初始化构造一个新的任务队列对象
  11. func NewSchedQueue() *SchedQueue {
  12. return &SchedQueue{
  13. taskList: list.New(),
  14. }
  15. }
  16. // 返回队列存储的节点数量
  17. func (q *SchedQueue) Length() int {
  18. return q.taskList.Len()
  19. }
  20. // 将元素从队列尾部加入队列
  21. func (q *SchedQueue) AddBack(event SchedEvent) {
  22. q.taskList.PushBack(event)
  23. }
  24. // 将元素从队列头部加入队列
  25. func (q *SchedQueue) AddFront(event SchedEvent) {
  26. q.taskList.PushFront(event)
  27. }
  28. // 基于时间点将元素插入队列
  29. func (q *SchedQueue) Insert(event SchedEvent) {
  30. var(
  31. elem *list.Element
  32. et SchedEvent
  33. prioEvent, prioElem int
  34. binsert bool
  35. )
  36. // 从头遍历,比较时间并插入
  37. binsert = false
  38. for elem = q.taskList.Front(); elem != nil; elem = elem.Next() {
  39. et = (elem.Value).(SchedEvent)
  40. // 时间时间点早于比较时间的时间点,则插入到其前方
  41. if event.GetEventTime().Unix() < et.GetEventTime().Unix() {
  42. q.taskList.InsertBefore(event, elem)
  43. binsert = true
  44. break
  45. }
  46. // 如果相等,则比较事件对象的优先级,优先级高则插入
  47. if event.GetEventTime().Unix() == et.GetEventTime().Unix() {
  48. prioEvent = GetSchedEventTypePriority(event.GetEventType())
  49. prioElem = GetSchedEventTypePriority(et.GetEventType())
  50. if prioEvent > prioElem{
  51. q.taskList.InsertBefore(event, elem)
  52. binsert = true
  53. break
  54. }
  55. }
  56. }
  57. // 没有找到插入点,则默认插入到队列尾部
  58. if !binsert {
  59. q.AddBack(event)
  60. }
  61. return
  62. }
  63. // 返回队头元素,但元素不出队
  64. func (q *SchedQueue) Front() (event *SchedEvent) {
  65. if q.Length() > 0 {
  66. elem := q.taskList.Front()
  67. res := (elem.Value).(SchedEvent)
  68. event = &res
  69. return
  70. }else{
  71. return nil
  72. }
  73. }
  74. // 返回队头元素,元素出队
  75. func (q *SchedQueue) Pop() (event SchedEvent) {
  76. if q.Length() > 0 {
  77. elem := q.taskList.Front()
  78. event = (elem.Value).(SchedEvent)
  79. q.taskList.Remove(elem)
  80. return
  81. }else{
  82. return nil
  83. }
  84. }