介绍go中的计时器和滴答器
Timers 我们经常希望在未来的某个时间点执行 Go 代码,或者在某个时间间隔内重复执行。Go 内置的定时器和 ticker 功能可以轻松完成这两项任务。我们先来看看计时器,然后再看看 ticker。
timers.go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 package mainimport ( "fmt" "time" ) func main () { timer1 := time.NewTimer(2 * time.Second) <-timer1.C fmt.Println("Timer 1 fired" ) timer2 := time.NewTimer(time.Second) go func () { <-timer2.C fmt.Println("Timer 2 fired" ) }() stop2 := timer2.Stop() if stop2 { fmt.Println("Timer 2 stopped" ) } time.Sleep(2 * time.Second) }
第一个定时器将在我们启动程序后约 2 秒启动,但第二个定时器应在启动前停止。
log 1 2 3 $ go run timers.go Timer 1 fired Timer 2 stopped
Tickers 定时器用于在未来执行一次任务,而滴答器则用于定期重复执行任务。下面是一个计时器的示例,它定期滴答作响,直到我们停止。
tickers.go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package mainimport ( "fmt" "time" ) func main () { ticker := time.NewTicker(500 * time.Millisecond) done := make (chan bool ) go func () { for { select { case <-done: return case t := <-ticker.C: fmt.Println("Tick at" , t) } } }() time.Sleep(1600 * time.Millisecond) ticker.Stop() done <- true fmt.Println("Ticker stopped" ) }
当我们运行这个程序时,滴答声应该滴答 3 次才会停止。
log 1 2 3 4 5 $ go run tickers.go Tick at 2012-09-23 11:29:56.487625 -0700 PDT Tick at 2012-09-23 11:29:56.988063 -0700 PDT Tick at 2012-09-23 11:29:57.488076 -0700 PDT Ticker stopped
参考链接