golang中的定時器
阿新 • • 發佈:2021-11-08
1.timer 定時器,時間到了執行,只執行一次
package main import ( "fmt" "time" ) func main() { // 1. timer基本使用 /* timer1 := time.NewTimer(2 * time.Second) t := time.Now() fmt.Printf("t = %v\n", t) t2 := <-timer1.C fmt.Printf("t2 = %v\n", t2) */ // 2. 驗證timer只能響應一次 /* timer2 := time.NewTimer(time.Second) for { <-timer2.C // 第一次列印時間到,第二次就會死鎖(原因:timer2定時器只往通道中傳送一次Time資料) fmt.Println("時間到") } */ // 3. timer實現延時的功能 /* fmt.Println("開始了", time.Now()) time.Sleep(time.Second) fmt.Println("第一次延時:", time.Now()) timer3 := time.NewTimer(2 * time.Second) <-timer3.C fmt.Println("第二次延時:", time.Now()) <-time.After(3 * time.Second) // time.After() 就是對 NewTimer(d).C 的封裝 fmt.Println("第三次延時:", time.Now()) */ // 4. 停止定時器 /* timer4 := time.NewTimer(2 * time.Second) go func() { <-timer4.C fmt.Println("定時器執行了") }() //time.Sleep(3 * time.Second) // 注意:如果定時器執行了,然後在呼叫timer4.Stop()就會返回false,如果沒有執行就呼叫Stop()就會返回true // 定時器一旦被關閉,從定時器通道中讀取資料和後面的程式碼將不會在執行 b := timer4.Stop() if b { fmt.Println("timer4已經關閉") } for { } */ // 5. 重置定時器 fmt.Println(time.Now()) timer6 := time.NewTimer(3 * time.Second) timer6.Reset(time.Second) fmt.Println(<-timer6.C) }
2. Ticker:時間到了,多次執行
package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup func main() { // 2. ticker 定時器,時間到了多次執行 ticker := time.NewTicker(1 * time.Second) wg.Add(1) go func() { i := 1 for { fmt.Println(<-ticker.C) if i == 5 { ticker.Stop() break } i++ } wg.Done() fmt.Println("子 goroutine結束了") }() wg.Wait() fmt.Println("主 goroutine 結束了...") }