中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang中怎么實現一個cron 定時器

發布時間:2021-06-12 17:36:42 來源:億速云 閱讀:768 作者:Leah 欄目:編程語言

本篇文章為大家展示了Golang中怎么實現一個cron 定時器,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

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 定時器,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

克山县| 璧山县| 兴和县| 土默特左旗| 濮阳县| 黄浦区| 乌兰浩特市| 八宿县| 汤原县| 峨边| 南乐县| 曲水县| 卢湾区| 钟祥市| 汉沽区| 韶山市| 道孚县| 民乐县| 深水埗区| 定远县| 陆河县| 汕头市| 纳雍县| 武鸣县| 平顶山市| 祁东县| 溧水县| 乌海市| 景谷| 扶绥县| 中阳县| 徐水县| 长寿区| 高密市| 讷河市| 牟定县| 福安市| 玛沁县| 颍上县| 浪卡子县| 林甸县|