6-并发编程之-定时器
一 Timer
时间到了,执行只执行1次(延迟任务)
package main
import (
"fmt"
"sync"
"time"
)
//timer 只能按时触发一次,可通过Reset()重置后继续触发。
func main() {
var wg sync.WaitGroup
timer:=time.NewTimer(1*time.Second)
wg.Add(1)
go func() {
for{
select {
case <-timer.C:
fmt.Println("定时1s,我执行了")
wg.Done()
}
}
}()
wg.Wait()
}
1.2 通过Reset重写设置定时器
package main
import (
"fmt"
"time"
)
//timer 只能按时触发一次,可通过Reset()重置后继续触发。
func main() {
timer := time.NewTimer(1 * time.Second)
go func() {
var count = 0
for {
select {
case <-timer.C:
fmt.Println("定时1s,我执行了")
}
count++
if count <= 5 {
timer.Reset(5 * time.Second)
}
}
}()
time.Sleep(10 * time.Second)
}
1.3 使用time.After() 实现定时任务
// 阻塞一下,等待主进程结束
timer := time.NewTimer(time.Second * 10)
<-timer.C // 等10s,才会有值
fmt.Println("over.")
<-time.After(time.Second * 4)
fmt.Println("再等待4秒退出。timer 没有终止,打印出 over 后会看见在继续执行...")
timer.Stop()
<-time.After(time.Second * 2)
fmt.Println("timer.Stop()后, timer 仍继续执行,只是关闭了 tt.C 通道。")
package main
import (
"fmt"
"time"
)
func main() {
<-time.After(time.Second * 4)
fmt.Println("4s后执行")
}
二 Ticker
时间到了,多次执行(定时任务)
package main
import (
"fmt"
"time"
)
func main() {
var i = 0
ticker := time.NewTicker(time.Second * 1) // 创建一个定时器对象
//开启go协程
go func() {
for {
select {
case <-ticker.C: // 每隔一秒,会执行一次
fmt.Printf("执行了第%d次\n", i)
i++
if i >= 10 {
ticker.Stop() // 停止定时器
}
}
}
}()
time.Sleep(15*time.Second)
}