重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇文章为大家展示了Golang中怎么实现一个cron 定时器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
创新互联是一家专业提供洛南企业网站建设,专注与成都网站建设、成都网站设计、H5技术、小程序制作等业务。10年已为洛南众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。
crontab.go
package task import ( "sync" "github.com/pkg/errors" cron "github.com/robfig/cron/v3" ) // Crontab crontab manager type Crontab struct { inner *cron.Cron ids map[string]cron.EntryID mutex sync.Mutex } // NewCrontab new crontab func NewCrontab() *Crontab { return &Crontab{ inner: cron.New(), ids: make(map[string]cron.EntryID), } } // IDs ... func (c *Crontab) IDs() []string { c.mutex.Lock() defer c.mutex.Unlock() validIDs := make([]string, 0, len(c.ids)) invalidIDs := make([]string, 0) for sid, eid := range c.ids { if e := c.inner.Entry(eid); e.ID != eid { invalidIDs = append(invalidIDs, sid) continue } validIDs = append(validIDs, sid) } for _, id := range invalidIDs { delete(c.ids, id) } return validIDs } // Start start the crontab engine func (c *Crontab) Start() { c.inner.Start() } // Stop stop the crontab engine func (c *Crontab) Stop() { c.inner.Stop() } // DelByID remove one crontab task func (c *Crontab) DelByID(id string) { c.mutex.Lock() defer c.mutex.Unlock() eid, ok := c.ids[id] if !ok { return } c.inner.Remove(eid) delete(c.ids, id) } // AddByID add one crontab task // id is unique // spec is the crontab expression func (c *Crontab) AddByID(id string, spec string, cmd cron.Job) error { c.mutex.Lock() defer c.mutex.Unlock() if _, ok := c.ids[id]; ok { return errors.Errorf("crontab id exists") } eid, err := c.inner.AddJob(spec, cmd) if err != nil { return err } c.ids[id] = eid return nil } // AddByFunc add function as crontab task func (c *Crontab) AddByFunc(id string, spec string, f func()) error { c.mutex.Lock() defer c.mutex.Unlock() if _, ok := c.ids[id]; ok { return errors.Errorf("crontab id exists") } eid, err := c.inner.AddFunc(spec, f) if err != nil { return err } c.ids[id] = eid return nil } // IsExists check the crontab task whether existed with job id func (c *Crontab) IsExists(jid string) bool { _, exist := c.ids[jid] return exist }
crontab_test.go
package task import ( "fmt" "os" "testing" "time" ) type testTask struct { } func (t *testTask) Run() { fmt.Println("hello world1", time.Now()) } func TestCronTask(t *testing.T) { crontab := NewCrontab() // 实现接口的方式添加定时任务 task := &testTask{} //2m 一次 if err := crontab.AddByID("1", "*/2 * * * ?", task); err != nil { fmt.Printf("error to add crontab task:%s", err) os.Exit(-1) } // 添加函数作为定时任务 taskFunc := func() { fmt.Println("hello world2", time.Now()) } //而 github.com/robfig/cron 也按照操作系统进行判断,默认支持到分钟级别 ,1分钟一次 if err := crontab.AddByFunc("2", "*/1 * * * ?", taskFunc); err != nil { fmt.Printf("error to add crontab task:%s", err) os.Exit(-1) } crontab.Start() select {} }
go cron 只支持
{分} {时} {日} {月} {周} {年(可选)}
上述内容就是Golang中怎么实现一个cron 定时器,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。