发布时间:2024-11-21 21:54:47
定时器是一种特殊类型的goroutine(轻量级线程), 它可以在指定的时间点执行某个任务或者在一定时间间隔内重复执行任务。
单次定时器(time.Timer):
单次定时器只会触发一次,当定时器到期后,可以通过其`C`属性接收到一个信号,然后进行相应的任务处理。 ``` go package main import ( "fmt" "time" ) func main() { timer1 := time.NewTimer(2 * time.Second) <-timer1.C fmt.Println("Timer 1 expired") timer2 := time.NewTimer(time.Second) go func() { <-timer2.C fmt.Println("Timer 2 expired") }() stop2 := timer2.Stop() if stop2 { fmt.Println("Timer 2 stopped") } } ```周期定时器(time.Ticker):
周期定时器会每隔一段时间触发一次,并且会在每次触发后重置定时器,以便下次触发。 ``` go package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(500 * time.Millisecond) go func() { for t := range ticker.C { fmt.Println("Tick at", t) } }() time.Sleep(1600 * time.Millisecond) ticker.Stop() fmt.Println("Ticker stopped") } ```无需停止的周期定时器(time.NewTicker):
无需停止的周期定时器和周期定时器类似,区别在于定时触发的时间点不受任务的处理时间长度影响。也就是说,如果任务的处理时间超过了定时器的触发间隔,无需停止的周期定时器会在任务处理完成后立即触发,没有延迟。 ``` go package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(500 * time.Millisecond) go func() { for { select { case t := <-ticker.C: fmt.Println("Tick at", t) time.Sleep(1 * time.Second) // 模拟长时间任务 } } }() time.Sleep(3000 * time.Millisecond) ticker.Stop() fmt.Println("Ticker stopped") } ```