Go 的定時器
這個東西其實早就應該總結一下了,然而一直懶=_=,順便事情很多,就一直沒有總結。為什麼需要做一個定時器呢,假設我們現在有個服務,服務過程中需要從 redis 中讀取快取資料,如果快取資料不存在那麼我們讀線上資料庫,讀取完畢之後寫入 redis 作為熱資料。這個過程中,如果是同步的,很明顯,讀寫快取的操作是不應該阻塞主要服務的,這時候我們就需要自己做個定時器來做超時機制,防止因為快取服務的問題而影響主要服務(當然,做成非同步是OK的)。
Code Here
// author by @xiaoyusilen
package main
import (
"fmt"
"time"
)
func loop() int {
for i := 0; i < 100; i++ {
fmt.Println(i)
}
return 0
}
func main() {
ticker := time.Timer(time.Microsecond * 1) // 新建一個定時器,設定超時時間,這裡設定的是1微秒
ch := make(chan *int, 1) // 設定一個 chan 接收服務返回值
go loop() // 起一個 goroutine 執行服務
select {
case <-ch: // 如果收到服務返回值,則說明未超時
ticker.Stop() // 停止計時器
return
case <-ticker.C: // 如果先收到定時器的訊號,則說明超時了
fmt.Println("timeout") // 這裡做超時處理
return
}
}
這裡寫的非常簡易~可以根據需要自行更改,至於用time.Timer
更好還是time.Ticker
更好,取決於實際情況,這兩個最大的區別在於,time.Ticker
不能呼叫time.After()
方法,而且time.Ticker.Stop()
呼叫了stopTimer
的方法。這裡的超時時間定為1微秒了,為了測試方便並且造成超時的情況,具體的超時時間根據業務需求來決定,通常超時時間不能超過主要服務的平均響應時間。
測試結果如下,可以看到還沒有輸出完畢就超時了。
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
timeout
好咯,一個簡單的定時器就這樣完成了~
FYI
相關文章
- GO的定時器Timer 和定時任務cronGo定時器
- Go定時器的三種實現方式Go定時器
- 【Go進階—基礎特性】定時器Go定時器
- 定時器以及定時器的幾個案例定時器
- 掌握 Go 的計時器Go
- Java & Go 定時任務JavaGo
- 【JavaScript定時器小案例】常見的幾種定時器實現的案例JavaScript定時器
- JavaScript定時器JavaScript定時器
- iOS定時器iOS定時器
- Timer(定時器)定時器
- JavaScript 定時器JavaScript定時器
- js定時器JS定時器
- python定時器Python定時器
- 定時器引發的思考定時器
- Golang當中的定時器Golang定時器
- 詳解 Go 語言的計時器Go
- 詳解Go語言的計時器Go
- 純生JS輪播,定時器新增和清除定時器JS定時器
- Linux核心定時器Linux定時器
- JMeter—定時器(八)JMeter定時器
- Flink onTimer定時器定時器
- Qt - QTimer(定時器)QT定時器
- python flask 定時器PythonFlask定時器
- TIM-定時器定時器
- Java - Timer定時器Java定時器
- Systemd 定時器教程定時器
- java 中定時器Java定時器
- Qt QTimer定時器QT定時器
- iOS中的3種定時器iOS定時器
- golang 定時器的不同任務Golang定時器
- 基於51微控制器的定時器定時器
- C++定時器CTimer的實現C++定時器
- Tim定時器初始化的方法定時器
- VUE簡單的定時器實時重新整理Vue定時器
- 好用的時間跟蹤定時器:Eon Timer for Mac定時器Mac
- JavaScript6:定時器JavaScript定時器
- 5.9 jmeter元件-定時器JMeter元件定時器
- Java之定時器TimerJava定時器
- 19. 通用定時器定時器