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
- 定時器定時器
- java定時器的使用Java定時器
- [iOS]各種定時器–最全的定時器使用iOS定時器
- iOS定時器iOS定時器
- JavaScript定時器JavaScript定時器
- js定時器JS定時器
- JavaScript 定時器JavaScript定時器
- 核心定時器定時器
- 【JavaScript定時器小案例】常見的幾種定時器實現的案例JavaScript定時器
- 詳解 Go 語言的計時器Go
- 詳解Go語言的計時器Go
- lua定時器與定時任務的介面設計定時器
- 定時器引發的思考定時器
- iOS cell上的定時器iOS定時器
- TCP的四種定時器TCP定時器
- VC中定時器的使用定時器
- Windows控制檯的定時器Windows定時器
- C++定時器的使用C++定時器
- Golang當中的定時器Golang定時器
- Qt中的定時器的使用QT定時器
- 純生JS輪播,定時器新增和清除定時器JS定時器
- java 中定時器Java定時器
- python定時器Python定時器
- Systemd 定時器教程定時器
- JMeter—定時器(八)JMeter定時器
- 關於定時器定時器
- Python 定時器Python定時器
- android定時器Android定時器
- 閉包、定時器定時器
- jmeter(七)定時器JMeter定時器
- 整理:java定時器。Java定時器
- Android 定時器Android定時器