1
0
镜像自地址 https://github.com/tuna/tunasync.git 已同步 2025-12-06 06:26:46 +00:00

feature(worker): job schedule

这个提交包含在:
bigeagle
2016-04-24 20:23:44 +08:00
父节点 f31bcfbcc3
当前提交 b077db1d0b
共有 5 个文件被更改,包括 191 次插入33 次删除

71
worker/schedule.go 普通文件
查看文件

@@ -0,0 +1,71 @@
package worker
// schedule queue for jobs
import (
"sync"
"time"
"github.com/ryszard/goskiplist/skiplist"
)
type scheduleQueue struct {
sync.Mutex
list *skiplist.SkipList
}
func timeLessThan(l, r interface{}) bool {
tl := l.(time.Time)
tr := r.(time.Time)
return tl.Before(tr)
}
func newScheduleQueue() *scheduleQueue {
queue := new(scheduleQueue)
queue.list = skiplist.NewCustomMap(timeLessThan)
return queue
}
func (q *scheduleQueue) AddJob(schedTime time.Time, job *mirrorJob) {
q.Lock()
defer q.Unlock()
q.list.Set(schedTime, job)
}
// pop out the first job if it's time to run it
func (q *scheduleQueue) Pop() *mirrorJob {
q.Lock()
defer q.Unlock()
first := q.list.SeekToFirst()
if first == nil {
return nil
}
defer first.Close()
t := first.Key().(time.Time)
if t.Before(time.Now()) {
job := first.Value().(*mirrorJob)
q.list.Delete(first.Key())
return job
}
return nil
}
// remove job
func (q *scheduleQueue) Remove(name string) bool {
q.Lock()
defer q.Unlock()
cur := q.list.Iterator()
defer cur.Close()
for cur.Next() {
cj := cur.Value().(*mirrorJob)
if cj.Name() == name {
q.list.Delete(cur.Key())
return true
}
}
return false
}