前言
在go中,如果需要程序执行定时任务或者延时任务任务,它在time包提供了一些方法供使用
定时器使用
NewTimer
time.NewTimer() 是创建 Timer 的其中一种方式,通过传入一个定时时间,如
package main
import (
"log"
"time"
)
func main() {
a := time.NewTimer(3 * time.Second)
log.Println("============执行开始")
<-a.C
log.Println("============执行结束")
}
程序延时3s执行,输出结果为
但是NewTimer不用Reset()不能被复用,复用的话,会报错,如
package main
import (
"fmt"
"log"
"time"
)
func main() {
a := time.NewTimer(3 * time.Second)
log.Println("============执行开始")
<-a.C
log.Println("============执行结束")
<-a.C
fmt.Println("asdasdsd")
}
重置定时器
package main
import (
"log"
"time"
)
func main() {
a := time.NewTimer(3 * time.Second)
for {
select {
case x, y := <-a.C:
log.Println("===========", x, y)
a.Reset(3 * time.Second)
}
}
}
输出结果为
停止定时器为
package main
import (
"log"
"time"
)
func main() {
a := time.NewTimer(3 * time.Second)
defer a.Stop()
for {
select {
case x, y := <-a.C:
log.Println("===========", x, y)
a.Reset(3 * time.Second)
}
}
}
NewTicker
NewTicker定时器不用重置就可以实现定时任务
package main
import (
"log"
"time"
)
func main() {
a := time.NewTicker(3 * time.Second)
defer a.Stop()
for {
select {
case x, y := <-a.C:
log.Println("===========", x, y)
}
}
}
Stop()方法是停止定时器
Rest()方法重置定时器
package main
import (
"log"
"time"
)
func main() {
a := time.NewTicker(3 * time.Second)
defer a.Stop()
for {
select {
case x, y := <-a.C:
log.Println("===========", x, y)
a.Reset(4 * time.Second)
}
}
}
time.After()
time.After()用于延时几秒后执行,如
package main
import (
"log"
"time"
)
func main() {
a := time.After(3 * time.Second)
log.Println("===========开始执行")
<-a
log.Println("===========执行结束")
}
但是不能被复用
总结
time包提供了定时任务供调用,可以合理的利用里面的方法实现定时任务