go的timer定时器实现
示例如下:
package main import ( "fmt" "time" ) func testTimer1() { go func() { fmt.Println("test timer1") }() } func testTimer2() { go func() { fmt.Println(time.Now().String()) }() } func timer1() { timer1 := time.NewTicker(1 * time.Second) for { select { case <-timer1.C: testTimer1() } } } func timer2() { timer2 := time.NewTicker(5 * time.Second) for { select { case <-timer2.C: testTimer2() } } } func main() { go timer1() timer2() }
运行结果截屏如下:
看go的time部分源码 Ticker结构
type Ticker struct { C <-chan Time // The channel on which the ticks are delivered. r runtimeTimer }
go的time和ticket的调用
或者叫timmer internal和其他语言的开发思路不一样。
其他语言,多是注册回调函数,定时,时间到了调用回调。
go是 通过 chan
的阻塞实现的。
调用的地方,读取chan
定时,时间到,向chan写入值,阻塞解除,调用函数