網站首頁 編程語言 正文
總的來說
- Sleep是使用睡眠完成定時,結束后繼續往下執行循環來實現定時任務。
- Tick函數是使用channel阻塞當前協程,完成定時任務的執行
現在來看一下 兩種方法實現出來的效果有何不同
這里我們設置定時時長為5
使用“Do Something” 來模擬定時任務執行需要的時間 分1s執行,10s執行兩種情況
代碼如下
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結果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
設置任務執行時間為1s
end到下一次begin之間的間隔為5s (定時間隔)
其過程大致為:
|DO–>|Sleep---------->|Do–>|Sleep---------->|
Trick結果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
設置任務執行時間為1s
end到下一次begin之間的間隔為4s (定時間隔-任務執行時間)
其過程大致為:
(begin)Do–>(end)
|DO–>-----------|Do–>-------------|
|Sleep---------->|Sleep---------->|
Sleep結果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
設置任務執行時間為10s
end到下一次begin之間的間隔為5s (定時間隔)
其過程大致為:
|DO-------------------->|Sleep---------->|Do-------------------->|Sleep---------->|
Trick結果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
設置任務執行時間為10s
end到下一次begin之間的間隔為0s
此時因為任務執行時間大于定時間隔 當任務執行完畢時 已經沒有阻塞 所以可以立馬執行下一次
其過程大致為:
(begin)Do–>(end)
|DO-------------------->|Do----------------------->|
|Sleep---------->-------|Sleep---------->---------|
總結
從sleep和tick的實現結果的比較來看 可以發現
1.sleep進行定時任務 任務執行的時間對其實際定時間隔沒有影響 睡眠緊跟在任務結束后
2.sleep的定時間隔時間 = 上一個end 到 下一個begin 的時間
3.而tick的實現 使用了一個協程來進行定時 任務執行的時間會對其實際間隔時間產生影響
4.tick的(上一個begin到下一個begin時間) = max (定時間隔時間, 任務執行時間)
至于孰好孰壞 好像一般都是推薦tick 不過還是要看具體的環境再來決定
原文鏈接:https://blog.csdn.net/zkt286468541/article/details/89403306
相關推薦
- 2022-07-27 python如何為list實現find方法_python
- 2022-04-25 .NET避免裝箱的方法_實用技巧
- 2022-10-20 Android?PowerManagerService省電模式策略控制_Android
- 2022-08-18 C語言實現棧的示例代碼_C 語言
- 2021-10-13 linux環境下恢復rm誤刪的文件方法_Linux
- 2022-04-27 python進階之協程你了解嗎_python
- 2022-05-06 docker?save與docker?export的區別_docker
- 2022-11-26 python?布爾注入原理及滲透過程示例_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支