上次写了一篇关于golang crontab的用爱疯,这次说下golang timer定时器的用法。 golang的time.NewTicker创建定时任务时,是阻塞同步的。如果不想因为同步阻塞了main线程,可以给每个定时函数分配一个goroutine协程。
该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。
golang的time模块提供了两个定时函数。 需要注意的是golang timer定时器是不能stop停止的,只能在逻辑上通过标示位来退出定时任务 。
// xiaorui.cc
// 使用AfterFunc
time.AfterFunc(5 * time.Minute, func() {
fmt.Printf("expired")
}
//
timer := time.NewTimer(5 * time.Minute)
<-timer.C
fmt.Printf("expired")
时间格式:
秒: time.Second 分钟: time.Minute
下面是go timer的具体使用实例。
package main
// xiaorui.cc
import (
"fmt"
"time"
)
func testTimer1() {
go func() {
fmt.Println("test timer1")
}()
}
func testTimer2() {
go func() {
fmt.Println("test timer2")
}()
}
func timer1() {
timer1 := time.NewTicker(2 * time.Second)
select {
case <-timer1.C:
testTimer1()
}
}
func timer2() {
timer2 := time.NewTicker(3 * time.Second)
select {
case <-timer2.C:
testTimer2()
}
}
func main() {
go timer1()
go timer2()
fmt.Println("will end")
time.Sleep(5 * time.Second)
}
定时任务的实现本来就没啥好说的,如果想实现那种可控的定时器,需要自己设置flag判断状态。 另外避免任务的同步阻塞,除非你本就想同步执行。
END.
