溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go怎么編寫定時(shí)器與定時(shí)任務(wù)

發(fā)布時(shí)間:2022-07-15 10:11:12 來源:億速云 閱讀:172 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Go怎么編寫定時(shí)器與定時(shí)任務(wù)”,在日常操作中,相信很多人在Go怎么編寫定時(shí)器與定時(shí)任務(wù)問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Go怎么編寫定時(shí)器與定時(shí)任務(wù)”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

    Go 編寫定時(shí)器和定時(shí)任務(wù)

    在 項(xiàng)目開發(fā)當(dāng)中,可能會(huì)遇到這樣的場(chǎng)景:

    1 A任務(wù)需要在多久之后執(zhí)行一次(定時(shí)器)

    2.B任務(wù)需要每隔多長(zhǎng)時(shí)間執(zhí)行一次 (定時(shí)任務(wù))

    談到定時(shí)任務(wù),離不開linux的crontab. 先簡(jiǎn)單了解下crontab

    // 每隔1秒執(zhí)行一次
    */1 * * * * ?
    
    // 每隔1分鐘執(zhí)行一次
    0 */1 * * * ?
    
    // 每天0點(diǎn)執(zhí)行一次
    0 0 0 * * ?
    
    // 每月1號(hào)凌晨1點(diǎn)執(zhí)行一次
    0 0 1 1 * ?
    
    // 在1分、2分、3分執(zhí)行一次
    0 1,2,3 * * * ?
    
    // 每天的0點(diǎn)、1點(diǎn)、2點(diǎn)執(zhí)行一次
    0 0 0,1,2 * * ?

    使用crontab實(shí)現(xiàn)定時(shí)器和定時(shí)任務(wù)也可以,但是crontab默認(rèn)只能精確到分鐘, 如果想要精確到秒可以使用for循環(huán)處理秒級(jí)人物

    * * * * * for i in $(seq 1 11); do echo test >> /etc/demo/demo.txt; sleep 1; done

    本文簡(jiǎn)單介紹下go 實(shí)現(xiàn)定時(shí)器和定時(shí)任務(wù)的用法以及簡(jiǎn)單介紹一個(gè)第三方庫(kù)gocron的用法

    Timer

    1 timer實(shí)現(xiàn)定時(shí)器 (延遲執(zhí)行), 這個(gè)定時(shí)器只會(huì)觸發(fā)一次.

    使用于場(chǎng)景1(當(dāng)然如果把下面的代碼寫在一個(gè)for循環(huán)中也可以實(shí)現(xiàn)定時(shí)任務(wù))

    Demo:

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	t := time.NewTimer(1 * time.Second)
    	<-t.C
    	fmt.Println("1 s 時(shí)間到")
    
    }

    結(jié)果:

    1 s 時(shí)間到

    2 停止定時(shí)器

    使用time.Stop() 停止定時(shí)器

    通過向通道發(fā)送一個(gè)信號(hào),通知定時(shí)器是否關(guān)閉

    Demo:

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func test12(ch chan int) bool {
    	timer := time.NewTimer(1 * time.Second)
    
    	select {
    	case <-ch:
    		if timer.Stop() {
    			fmt.Println("關(guān)閉定時(shí)器")
    		}
    		return true
    	default:
    		fmt.Println("繼續(xù)執(zhí)行定時(shí)器")
    		return true
    	}
    }
    
    func main() {
    
    	ch := make(chan int, 1)
    	// ch <- 1
    
    	go test12(ch)
    
    	for {
    
    	}
    }

    結(jié)果:

    繼續(xù)執(zhí)行定時(shí)器

    重置定時(shí)器

    Demo:

    func main() {
    	// 創(chuàng)建一個(gè)一個(gè)定時(shí)器
    	fmt.Println("定時(shí)器開始")
    	myT := time.NewTimer(7 * time.Second) // 設(shè)置7秒后執(zhí)行一次
    
    	// 重置定時(shí)器為 1s后執(zhí)行
    	myT.Reset(1 * time.Second)
    	<-myT.C
    	fmt.Println(" 1 s 時(shí)間到 ", time.Now().Unix())
    
    	for {
    	}
    }

    結(jié)果:

    定時(shí)器開始
     1 s 時(shí)間到  1648268475

    Ticker

    Ticker也是定時(shí)器,它是一個(gè)周期性的定時(shí)器 使用場(chǎng)景2

    設(shè)置3秒執(zhí)行一次Demo

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    
    	ticker := time.NewTicker(3 * time.Second)
    	defer ticker.Stop()
    
    	for range ticker.C {
    		fmt.Println("執(zhí)行的業(yè)務(wù)邏輯")
    	}
    }

    結(jié)果:

    ticker ticker ticker ...
    ticker ticker ticker ...
    ticker ticker ticker ...

    gocron

    一個(gè)第三方庫(kù)實(shí)現(xiàn)定時(shí)任務(wù) 場(chǎng)景2

    安裝

    go get -u github.com/go-co-op/gocron
    s := gocron.NewScheduler(time.UTC)
    s.Every(5).Seconds().Do(func(){ ... }) 
    s.Every("5m").Do(func(){ ... })
    s.Every(5).Days().Do(fu
    s.Every(1).Month(1, 2, 3).Do(func(){ ... })
    s.Every(1).Day().At("10:30").Do(func(){ ... })
    s.Every(1).Day().At("10:30;08:00").Do(func(){ ... })
    s.Every(1).Day().At("10:30").At("08:00").Do(func(){ ... })
    s.Every(1).MonthLastDay().Do(func(){ ... })
    s.Every(2).MonthLastDay().Do(func(){ ... })
    s.Cron("*/1 * * * *").Do(task) 
    s.StartAsync()
    s.StartBlocking()

    Demo

    package main
    
    import (
    	"fmt"
    	"time"
    
    	"github.com/go-co-op/gocron"
    )
    
    func cron1() {
    	fmt.Println("cron1")
    }
    
    func cron2() {
    	fmt.Println("cron2")
    }
    
    func main() {
    	timezone, _ := time.LoadLocation("Asia/Shanghai")
    	s := gocron.NewScheduler(timezone)
    
    	// 每秒執(zhí)行一次
    	s.Every(1).Seconds().Do(func() {
    		go cron1()
    	})
    
    	// 每秒執(zhí)行一次
    	s.Every(1).Second().Do(func() {
    		go cron2()
    	})
    
    	s.StartBlocking()
    }

    結(jié)果:

    cron2
    cron1
    cron1
    cron2
    cron1
    cron2
    cron1
    cron2

    到此,關(guān)于“Go怎么編寫定時(shí)器與定時(shí)任務(wù)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    go
    AI