Golang 定时器函数 每隔几分钟执行一个函数
延时调用 AfterFunc
package main
import (
"sync/atomic"
"time"
)
var count int64
func main() {
go caller()
select {}
}
func caller() {
// TODO 具体逻辑
log.Printf("test: %d\n", atomic.AddInt64(&count, 1))
// 每 5 秒执行一次,递归调用自己
time.AfterFunc(5*time.Second, caller)
}
打点器 Ticker
package main
import (
"sync/atomic"
"time"
)
var count int64
func main() {
go caller()
select {}
}
func caller() {
// 打点器和定时器的机制有点相似:一个通道用来发送数据。
// 在这个通道上使用内置的 `range` 来迭代值每隔
// 5 秒发送一次的值。
ticker := time.NewTicker(time.Second * 5)
go func() {
for t := range ticker.C {
fmt.Printf("time: %s, count: %d\n", t, atomic.AddInt64(&count, 1))
}
}()
// 打点器可以和定时器一样被停止。
// 一旦一个打点器停止了,将不能再从它的通道中接收到值。
// 在运行 16 秒后停止这个打点器。
time.Sleep(time.Second * 16)
ticker.Stop()
}
时光器 Timer
方法一
package main
import (
"sync/atomic"
"time"
)
var count int64
func main() {
go caller()
select {}
}
func caller() {
// 时光器
// 在这个通道上使用内置的 `range` 来迭代值每隔
// 5 秒发送一次的值。
timer := time.NewTimer(time.Second * 5)
go func() {
for t := range timer.C {
fmt.Printf("time: %s, count: %d\n", t, atomic.AddInt64(&count, 1))
// 重置时光器,5 秒后再执行
timer.Reset(time.Second * 5)
}
}()
// 一旦一个时光器停止了,将不能再从它的通道中接收到值。
// 运行 16 秒后停止这个打点器。
time.Sleep(time.Second * 16)
timer.Stop()
}
方法二(不推荐)
package main
import (
"sync/atomic"
"time"
)
var count int64
func main() {
go caller()
select {}
}
func caller() {
fmt.Printf("timer start: %s\n", time.Now())
// 时光器,5 秒后再执行
timer := time.NewTimer(time.Second * 5)
for {
// 5 次后停止时光器
if count == 5 {
timer.Stop()
break
}
select {
case t := <-timer.C:
fmt.Printf("time: %s, count: %d\n", t, atomic.AddInt64(&count, 1))
// 重置时光器,5 秒后再执行
timer.Reset(time.Second * 5)
// 或者在这里判断
// 5 次后停止时光器
//if count == 5 {
// timer.Stop()
// break
//}
}
}
fmt.Printf("timer stop: %s\n", time.Now())
}