詳解golang 定時任務(wù)time.Sleep和time.Tick實現(xiàn)結(jié)果比較
總的來說
- Sleep是使用睡眠完成定時,結(jié)束后繼續(xù)往下執(zhí)行循環(huán)來實現(xiàn)定時任務(wù)。
- Tick函數(shù)是使用channel阻塞當(dāng)前協(xié)程,完成定時任務(wù)的執(zhí)行
現(xiàn)在來看一下 兩種方法實現(xiàn)出來的效果有何不同
這里我們設(shè)置定時時長為5
使用“Do Something” 來模擬定時任務(wù)執(zhí)行需要的時間 分1s執(zhí)行,10s執(zhí)行兩種情況
代碼如下
func Test_Sleep(t *testing.T) {
?? ?for i := 0; i < 3; i++ {
?? ??? ?Debug("begin", time.Now().Format("2006-01-02_15:04:05"))
?? ??? ?Debug("Do something 1s")
?? ??? ?time.Sleep(time.Second * 1)
?? ??? ?Debug("end", time.Now().Format("2006-01-02_15:04:05"))
?? ??? ?time.Sleep(time.Second * 5)
?? ?}
}
func Test_Tick(t *testing.T) {
?? ?t1 := time.NewTicker(5 * time.Second)(5 * time.Second)
?? ?for {
?? ??? ?select {
?? ??? ?case <-t1.C:
?? ??? ??? ?Debug("begin", time.Now().Format("2006-01-02_15:04:05"))
?? ??? ??? ?Debug("Do something 1s")
?? ??? ??? ?time.Sleep(time.Second * 1)
?? ??? ??? ?Debug("end", time.Now().Format("2006-01-02_15:04:05"))
?? ??? ?}
?? ?}
}Sleep結(jié)果1:
2019/04/19 15:58:51 |DEBUG|Test_Sleep()|77|begin 2019-04-19_15:58:51
2019/04/19 15:58:51 |DEBUG|Test_Sleep()|78|Do something 1s
2019/04/19 15:58:52 |DEBUG|Test_Sleep()|80|end 2019-04-19_15:58:52
2019/04/19 15:58:57 |DEBUG|Test_Sleep()|77|begin 2019-04-19_15:58:57
2019/04/19 15:58:57 |DEBUG|Test_Sleep()|78|Do something 1s
2019/04/19 15:58:58 |DEBUG|Test_Sleep()|80|end 2019-04-19_15:58:58
2019/04/19 15:59:03 |DEBUG|Test_Sleep()|77|begin 2019-04-19_15:59:03
2019/04/19 15:59:03 |DEBUG|Test_Sleep()|78|Do something 1s
2019/04/19 15:59:04 |DEBUG|Test_Sleep()|80|end 2019-04-19_15:59:04
設(shè)置任務(wù)執(zhí)行時間為1s
end到下一次begin之間的間隔為5s (定時間隔)
其過程大致為:
|DO–>|Sleep---------->|Do–>|Sleep---------->|
Trick結(jié)果1
2019/04/19 16:22:09 |DEBUG|Test_Trick()|90|begin 2019-04-19_16:22:09
2019/04/19 16:22:09 |DEBUG|Test_Trick()|91|Do something 1s
2019/04/19 16:22:10 |DEBUG|Test_Trick()|93|end 2019-04-19_16:22:10
2019/04/19 16:22:14 |DEBUG|Test_Trick()|90|begin 2019-04-19_16:22:14
2019/04/19 16:22:14 |DEBUG|Test_Trick()|91|Do something 1s
2019/04/19 16:22:15 |DEBUG|Test_Trick()|93|end 2019-04-19_16:22:15
2019/04/19 16:22:19 |DEBUG|Test_Trick()|90|begin 2019-04-19_16:22:19
2019/04/19 16:22:19 |DEBUG|Test_Trick()|91|Do something 1s
2019/04/19 16:22:20 |DEBUG|Test_Trick()|93|end 2019-04-19_16:22:20
設(shè)置任務(wù)執(zhí)行時間為1s
end到下一次begin之間的間隔為4s (定時間隔-任務(wù)執(zhí)行時間)
其過程大致為:
(begin)Do–>(end)
|DO–>-----------|Do–>-------------|
|Sleep---------->|Sleep---------->|
Sleep結(jié)果2:
2019/04/19 16:32:41 |DEBUG|Test_Sleep()|77|begin 2019-04-19_16:32:41
2019/04/19 16:32:41 |DEBUG|Test_Sleep()|78|Do something 10s
2019/04/19 16:32:51 |DEBUG|Test_Sleep()|80|end 2019-04-19_16:32:51
2019/04/19 16:32:56 |DEBUG|Test_Sleep()|77|begin 2019-04-19_16:32:56
2019/04/19 16:32:56 |DEBUG|Test_Sleep()|78|Do something 10s
2019/04/19 16:33:06 |DEBUG|Test_Sleep()|80|end 2019-04-19_16:33:06
設(shè)置任務(wù)執(zhí)行時間為10s
end到下一次begin之間的間隔為5s (定時間隔)
其過程大致為:
|DO-------------------->|Sleep---------->|Do-------------------->|Sleep---------->|
Trick結(jié)果2
2019/04/19 16:41:05 |DEBUG|Test_Tick()|90|begin 2019-04-19_16:41:05
2019/04/19 16:41:05 |DEBUG|Test_Tick()|91|Do something 10s
2019/04/19 16:41:15 |DEBUG|Test_Tick()|93|end 2019-04-19_16:41:15
2019/04/19 16:41:15 |DEBUG|Test_Tick()|90|begin 2019-04-19_16:41:15
2019/04/19 16:41:15 |DEBUG|Test_Tick()|91|Do something 10s
2019/04/19 16:41:25 |DEBUG|Test_Tick()|93|end 2019-04-19_16:41:25
設(shè)置任務(wù)執(zhí)行時間為10s
end到下一次begin之間的間隔為0s
此時因為任務(wù)執(zhí)行時間大于定時間隔 當(dāng)任務(wù)執(zhí)行完畢時 已經(jīng)沒有阻塞 所以可以立馬執(zhí)行下一次
其過程大致為:
(begin)Do–>(end)
|DO-------------------->|Do----------------------->|
|Sleep---------->-------|Sleep---------->---------|
總結(jié)
從sleep和tick的實現(xiàn)結(jié)果的比較來看 可以發(fā)現(xiàn)
1.sleep進行定時任務(wù) 任務(wù)執(zhí)行的時間對其實際定時間隔沒有影響 睡眠緊跟在任務(wù)結(jié)束后
2.sleep的定時間隔時間 = 上一個end 到 下一個begin 的時間
3.而tick的實現(xiàn) 使用了一個協(xié)程來進行定時 任務(wù)執(zhí)行的時間會對其實際間隔時間產(chǎn)生影響
4.tick的(上一個begin到下一個begin時間) = max (定時間隔時間, 任務(wù)執(zhí)行時間)
至于孰好孰壞 好像一般都是推薦tick 不過還是要看具體的環(huán)境再來決定
參考:http://www.dhdzp.com/article/211330.htm
到此這篇關(guān)于詳解golang 定時任務(wù)time.Sleep和time.Tick實現(xiàn)結(jié)果比較的文章就介紹到這了,更多相關(guān)golang time.Sleep和time.Tick內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang Gin框架實現(xiàn)多種數(shù)據(jù)格式返回結(jié)果詳解
這篇文章主要介紹了Golang Gin框架實現(xiàn)多種數(shù)據(jù)格式返回結(jié)果,我們都知道,一個完整的請求包含請求和處理請求以及結(jié)果返回三個步驟,在服務(wù)器端對請求處理完成以后,會將結(jié)果返回給客戶端,在gin框架中,支持返回多種請求數(shù)據(jù)格式,下面我們一起來看看2023-05-05
Go語言基礎(chǔ)語法和基本數(shù)據(jù)類型知識鞏固
這篇文章主要為大家介紹了Go語言基礎(chǔ)語法和基本數(shù)據(jù)類型知識鞏固,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11
Go語言基礎(chǔ)學(xué)習(xí)之?dāng)?shù)組的使用詳解
數(shù)組相必大家都很熟悉,各大語言也都有數(shù)組的身影。Go 語言也提供了數(shù)組類型的數(shù)據(jù)結(jié)構(gòu)。本文就來通過一些簡單的示例帶大家了解一下Go語言中數(shù)組的使用,希望對大家有所幫助2022-12-12
golang字符串轉(zhuǎn)64位整數(shù)的示例代碼
這篇文章主要介紹了golang字符串轉(zhuǎn)64位整數(shù),在Go語言中,可以使用strconv包中的ParseInt函數(shù)將字符串轉(zhuǎn)換為64位整數(shù),本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-09-09

