golang定时任务详解
不屈真实 · · 26611 次点击 · · 开始浏览在程序中经常需要按照指定的周期(以毫秒计)来调用函数或计算表达式,也即实现定时任务,使用time包中Tick和Sleep可以轻松实现定时任务
使用Tick每隔100毫秒打印"Hello TigerwolfC"
for range time.Tick(time.Millisecond*100){
fmt.Println("Hello TigerwolfC")
}
每隔100毫秒打印 "Hello TigerwolfC",也可以使用 time.Sleep()
for{
time.Sleep(time.Millisecond* 100)
fmt.Println("Hello TigerwolfC")
}
每隔5秒执行f()函数
c := time.Tick(5 * time.Second)
for {
<- c
go f()
}
也可使用定时器,例如
package main
import (
"fmt"
"time"
)
func main() {
var ch chan int
//定时任务
ticker := time.NewTicker(time.Second * 5)
go func() {
for range ticker.C {
fmt.Println(time.Now().Format("2006年01月02日 15:04:05"))
}
ch <- 1
}()
<-ch
}
输出结果:
2018年12月08日 08:30:47
2018年12月08日 08:30:52
2018年12月08日 08:30:57
2018年12月08日 08:31:02
2018年12月08日 08:31:07
2018年12月08日 08:31:12
......
如下例子,使用定时器每隔12小时从MySQL复制用户信息到Redis数据库
func CopyUserInfo() {
for {
rows, err := MysqlClient.Query("SELECT name,mail,department,title FROM UsersInfo")
if err != nil {
log4go.Info("query mysqlDB fail")
return
}
userInfos := make(map[int]models.UserInfo)
userInfo := models.UserInfo{}
i := 0
for rows.Next() {
rows.Scan(&userInfo.Name, &userInfo.Mail, &userInfo.Department, &userInfo.Title)
userInfos[i] = userInfo
i++
}
SetUserNameMail(userInfos) //save userInfo into Redis
SetUserDisplaynameMail(userInfos) //save userInfo into Redis
fmt.Println("userinfo copy to redis successfully")
ticker := time.NewTicker(time.Hour * 12)
<-ticker.C
}
}
启动的时候执行一次,以后每天晚上12点执行
func startTimer(f func()) {
go func() {
for {
f()
now := time.Now()
// 计算下一个零点
next := now.Add(time.Hour * 24)
next = time.Date(next.Year(), next.Month(), next.Day(), 0,0,0,0,next.Location())
t := time.NewTimer(next.Sub(now))
<-t.C
}
}()
}
如有不对欢迎指正,相互学习,共同进步。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
在程序中经常需要按照指定的周期(以毫秒计)来调用函数或计算表达式,也即实现定时任务,使用time包中Tick和Sleep可以轻松实现定时任务
使用Tick每隔100毫秒打印"Hello TigerwolfC"
for range time.Tick(time.Millisecond*100){
fmt.Println("Hello TigerwolfC")
}
每隔100毫秒打印 "Hello TigerwolfC",也可以使用 time.Sleep()
for{
time.Sleep(time.Millisecond* 100)
fmt.Println("Hello TigerwolfC")
}
每隔5秒执行f()函数
c := time.Tick(5 * time.Second)
for {
<- c
go f()
}
也可使用定时器,例如
package main
import (
"fmt"
"time"
)
func main() {
var ch chan int
//定时任务
ticker := time.NewTicker(time.Second * 5)
go func() {
for range ticker.C {
fmt.Println(time.Now().Format("2006年01月02日 15:04:05"))
}
ch <- 1
}()
<-ch
}
输出结果:
2018年12月08日 08:30:47
2018年12月08日 08:30:52
2018年12月08日 08:30:57
2018年12月08日 08:31:02
2018年12月08日 08:31:07
2018年12月08日 08:31:12
......
如下例子,使用定时器每隔12小时从MySQL复制用户信息到Redis数据库
func CopyUserInfo() {
for {
rows, err := MysqlClient.Query("SELECT name,mail,department,title FROM UsersInfo")
if err != nil {
log4go.Info("query mysqlDB fail")
return
}
userInfos := make(map[int]models.UserInfo)
userInfo := models.UserInfo{}
i := 0
for rows.Next() {
rows.Scan(&userInfo.Name, &userInfo.Mail, &userInfo.Department, &userInfo.Title)
userInfos[i] = userInfo
i++
}
SetUserNameMail(userInfos) //save userInfo into Redis
SetUserDisplaynameMail(userInfos) //save userInfo into Redis
fmt.Println("userinfo copy to redis successfully")
ticker := time.NewTicker(time.Hour * 12)
<-ticker.C
}
}
启动的时候执行一次,以后每天晚上12点执行
func startTimer(f func()) {
go func() {
for {
f()
now := time.Now()
// 计算下一个零点
next := now.Add(time.Hour * 24)
next = time.Date(next.Year(), next.Month(), next.Day(), 0,0,0,0,next.Location())
t := time.NewTimer(next.Sub(now))
<-t.C
}
}()
}
如有不对欢迎指正,相互学习,共同进步。