這個東西其實早就應(yīng)該總結(jié)一下了虑稼,然而一直懶=_=,順便事情很多势木,就一直沒有總結(jié)蛛倦。為什么需要做一個定時器呢,假設(shè)我們現(xiàn)在有個服務(wù)啦桌,服務(wù)過程中需要從 redis 中讀取緩存數(shù)據(jù)溯壶,如果緩存數(shù)據(jù)不存在那么我們讀線上數(shù)據(jù)庫,讀取完畢之后寫入 redis 作為熱數(shù)據(jù)震蒋。這個過程中茸塞,如果是同步的躲庄,很明顯查剖,讀寫緩存的操作是不應(yīng)該阻塞主要服務(wù)的,這時候我們就需要自己做個定時器來做超時機(jī)制噪窘,防止因為緩存服務(wù)的問題而影響主要服務(wù)(當(dāng)然笋庄,做成異步是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) // 新建一個定時器倔监,設(shè)置超時時間直砂,這里設(shè)置的是1微秒
ch := make(chan *int, 1) // 設(shè)置一個 chan 接收服務(wù)返回值
go loop() // 起一個 goroutine 執(zhí)行服務(wù)
select {
case <-ch: // 如果收到服務(wù)返回值,則說明未超時
ticker.Stop() // 停止計時器
return
case <-ticker.C: // 如果先收到定時器的信號浩习,則說明超時了
fmt.Println("timeout") // 這里做超時處理
return
}
}
這里寫的非常簡易~可以根據(jù)需要自行更改静暂,至于用time.Timer
更好還是time.Ticker
更好,取決于實際情況谱秽,這兩個最大的區(qū)別在于洽蛀,time.Ticker
不能調(diào)用time.After()
方法,而且time.Ticker.Stop()
調(diào)用了stopTimer
的方法疟赊。這里的超時時間定為1微秒了郊供,為了測試方便并且造成超時的情況,具體的超時時間根據(jù)業(yè)務(wù)需求來決定近哟,通常超時時間不能超過主要服務(wù)的平均響應(yīng)時間驮审。
測試結(jié)果如下,可以看到還沒有輸出完畢就超時了吉执。
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
好咯疯淫,一個簡單的定時器就這樣完成了~