分享
  1. 首页
  2. 文章

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
 }
 }()
}

如有不对欢迎指正,相互学习,共同进步。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:不屈真实

查看原文:golang定时任务详解

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
26611 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏