脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Golang cron 定时器和定时任务的使用场景

Golang cron 定时器和定时任务的使用场景

2022-11-24 10:43beyond阿亮 Golang

Ticker是一个周期触发定时的计时器,它会按照一个时间间隔往channel发送系统当前时间,而channel的接收者可以以固定的时间间隔从channel中读取事件,这篇文章主要介绍了Golang cron 定时器和定时任务,需要的朋友可以参考下

Golang cron 定时器和定时任务

Golang中time包有两个定时器,分别为 ticker 和 timer。两者都可以实现定时功能,但各自都有自己的使用场景。

timer和ticker的区别

  • ticker定时器表示每隔一段时间就执行一次,一般可执行多次。
  • timer定时器表示在一段时间后执行,默认情况下只执行一次,如果想再次执行的话,每次都需要调用 time.Reset() 方法,此时效果类似ticker定时器。同时也可以调用 Stop() 方法取消定时器
  • timer定时器比ticker定时器多一个 Reset() 方法,两者都有 Stop() 方法,表示停止定时器,底层都调用了stopTimer() 函数。

Timer

Timer是一个定时器。代表未来的一个单一事件,你可以告诉timer你要等待多长时间。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main
 
import (
    "fmt"
    "time"
)
 
func main() {
 
    //设置定时器为3秒
    timer := time.NewTimer(3 * time.Second)
    fmt.Println("当前时间为:", time.Now())
 
    t := <-timer.C //从定时器拿数据
    fmt.Println("当前时间为:", t)
}

Ticker

Ticker是一个周期触发定时的计时器,它会按照一个时间间隔往channel发送系统当前时间,而channel的接收者可以以固定的时间间隔从channel中读取事件。

Ticker是一个定时触发的计时器,
它会以一个间隔(interval)往channel发送一个事件(当前时间),
而channel的接收者可以以固定的时间间隔从channel中读取事件。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main
 
import (
    "fmt"
    "time"
)
 
func main() {
 
    //创建一个周期性的定时器
    ticker := time.NewTicker(3 * time.Second)
    fmt.Println("当前时间为:", time.Now())
 
    go func() {
        for {
 
            //从定时器中获取数据
            t := <-ticker.C
            fmt.Println("当前时间为:", t)
 
        }
    }()
 
    for {
        time.Sleep(time.Second * 1)
    }
}

cron 定时任务

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package main
 
import (
    "github.com/robfig/cron"
    "log"
    "time"
)
 
func main() {
    //cron1()
 
    //cron2()
 
    cron3()
 
    select {
    }
}
 
func cron1()  {
    log.Println("Starting...")
    c := cron.New()
    c.AddFunc("* * * * * *", func() {
        log.Println("Run models.CleanAllTag...")
    })
    c.AddFunc("* * * * * *", func() {
        log.Println("Run models.CleanAllArticle...")
    })
 
    c.Start()
 
    t1 := time.NewTimer(time.Second * 10)
    for {
    select {
    case <-t1.C:
        t1.Reset(time.Second * 10)
    }
    }
}
 
func cron2()  {
    log.Println("Starting...")
    c := cron.New()  // 新建一个定时任务对象
    c.AddFunc("* * * * * *", func() {
        log.Println("hello world")
    })  // 给对象增加定时任务
    c.Start()
    //select {
    //}
    time.Sleep(10 * time.Second)
    c.Stop()
}
 
func cron3()  {
    log.Println("Starting...")
 
    c := cron.New()
    h := Hello{"I Love You!"}
    // 添加定时任务
    c.AddJob("*/2 * * * * *", h)
    // 添加定时任务 5秒执行一次
    c.AddFunc("*/5 * * * * *", func() {
        log.Println("hello word")
    })
 
    s, err := cron.Parse("*/3 * * * * *")
    if err != nil {
        log.Println("Parse error")
    }
    h2 := Hello{"I Hate You!"}
    c.Schedule(s, h2)
    // 其中任务
    c.Start()
    // 关闭任务
    defer c.Stop()
}
 
type Hello struct {
    Str string
}
 
func(h Hello) Run() {
    log.Println(h.Str)
}

参考链接:

https://blog.haohtml.com/archives/19859
https://studygolang.com/articles/17624
https://www.jianshu.com/p/fd3dda663953
https://blog.51cto.com/u_13914991/2294357
https://www.cnblogs.com/yinzhengjie/p/12244385.html
https://blog.51cto.com/u_13914991/2294357

到此这篇关于Golang cron 定时器和定时任务的文章就介绍到这了,更多相关Golang cron 定时任务内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/yinjl123456/article/details/127115171

延伸 · 阅读

精彩推荐
  • Golang解决goland 导入项目后import里的包报红问题

    解决goland 导入项目后import里的包报红问题

    这篇文章主要介绍了解决goland 导入项目后import里的包报红问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    ゞIT,java18612021-06-21
  • GolangGo Java算法之累加数示例详解

    Go Java算法之累加数示例详解

    这篇文章主要为大家介绍了Go Java算法之累加数示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    黄丫丫10252022-11-11
  • GolangGolang断言判断值类型的实现方法

    Golang断言判断值类型的实现方法

    这篇文章主要介绍了Golang断言判断值类型的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    鹿灏楷silves7432021-04-21
  • GolangGo语言中的通道channel详情

    Go语言中的通道channel详情

    这篇文章主要介绍了Go语言中的通道channel,在Go语言中管道类似于一个数据流,每次放入或者取出一部分数据,数据取出后原通道内的数据就删除掉,在linux操作...

    酷尔。8122022-02-25
  • Golang使用client go实现自定义控制器的方法

    使用client go实现自定义控制器的方法

    本文我们来使用client-go实现一个自定义控制器,通过判断service的Annotations属性是否包含ingress/http,如果包含则创建ingress,如果不包含则不创建,对client g...

    油腻中年李大鹅8642022-10-07
  • Golang一篇文章带你了解Go语言基础之变量

    一篇文章带你了解Go语言基础之变量

    简单点说,我们写的程序默认数据都是保存在内存条中的,我们不可能直接通过地址找到这个变量,因为地址太长了,而且不容易记。...

    Go语言进阶学习5872021-09-30
  • GolangGolang 实现interface类型转string类型

    Golang 实现interface类型转string类型

    这篇文章主要介绍了Golang 实现interface类型转string类型的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    一条小码农10792021-05-28
  • Golanggolang 一次性定时器Timer用法及实现原理详解

    golang 一次性定时器Timer用法及实现原理详解

    这篇文章主要为大家介绍了golang 一次性定时器Timer用法及实现原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加...

    yi个俗人11612022-11-12