package scheduler import ( "github.com/robfig/cron/v3" "sync" ) var taskList = make(chan *CronTask, 10) var taskMap = make(map[string]*CronTask) var lock sync.Mutex var c = newWithSeconds() type CronTask struct { Name string Spec string Fn func() } func AddCronTask(task *CronTask) bool { lock.Lock() defer lock.Unlock() if task == nil { return false } _, exist := taskMap[task.Name] if exist { return false } taskList <- task return true } func CronRun() { go c.Start() //监听任务列表 go func() { defer close(taskList) for { select { case task, ok := <-taskList: { if ok { _, err := c.AddFunc(task.Spec, task.Fn) if err != nil { panic(err) } } } } } }() } func newWithSeconds() *cron.Cron { return cron.New(cron.WithParser(cron.NewParser( cron.SecondOptional | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor, ))) }