Golang cron 定时器和定时任务(简单示例)

Golangcron 定时器和定时任务

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

timer和ticker的区别

  • ticker定时器表示每隔一段时间就执行一次,一般可执行多次。

  • timer定时器表示在一段时间后执行,默认情况下只执行一次,如果想再次执行的话,每次都需要调用time.Reset()方法,此时效果类似ticker定时器。同时也可以调用 Stop() 方法取消定时器

  • timer定时器比ticker定时器多一个 Reset() 方法,两者都有 Stop() 方法,表示停止定时器,底层都调用了stopTimer() 函数。

Timer

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

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中读取事件。

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

运行截图:

Golang cron 定时器和定时任务(简单示例)_第1张图片

cron 定时任务(简单示例)

对cron表达式不熟悉的读者可到这个链接了解一下:https://blog.csdn.net/xijinno1/article/details/129741457

Cron v1包:"github.com/robfig/cron"

把第三方库下载下来:

go get -v -u github.com/robfig/cron

go get github.com/robfig/cron

小demo:每隔一秒打印"helloworld"

package main

import (
    "github.com/robfig/cron"
    "log"
)

func main() {
    log.Println("Starting...")

    c := cron.New() // 新建一个定时任务对象
    c.AddFunc("* * * * * *", func() {
        log.Println("hello world")

    }) // 给对象增加定时任务
    c.Start()
    select {}
}

运行截图:

Golang cron 定时器和定时任务(简单示例)_第2张图片

Cronv3包:"github.com/robfig/cron/v3"

把第三方库下载下来:

go get -v -u github.com/robfig/cron/v3

go get github.com/robfig/cron/v3

小demo:每隔一分钟打印一次信息

package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
    "time"
)

func TestCron() {
    c := cron.New()
    i := 1
    EntryID, err := c.AddFunc("*/1 * * * *", func() {
        fmt.Println(time.Now(), "每分钟执行一次", i)
        i++
    })
    fmt.Println(time.Now(), EntryID, err)

    c.Start()
    time.Sleep(time.Minute * 5)
}
func main() {
    TestCron()
}

运行截图:

Golang cron 定时器和定时任务(简单示例)_第3张图片

Cron v1/v3新老版本区别

老版本的最大区别在于如果需要秒级定义,需要额外传入参数,并且可以自由配置参数

c :=cron.New(cron.WithSeconds()) // 秒级操作cron.WithSeconds()

3.相对旧版的改动(常用部分,详细可参考 Go 每日一库之 cron)

3.1. 秒级操作

cron.WithSeconds()

3.2. 函数没执行完就跳过本次函数

cron.WithChain(cron.SkipIfStillRunning(cron.DefaultLogger))

3.3. 打印任务日志

cron.WithLogger(cron.VerbosePrintfLogger(log.New(os.Stdout,"cron: ", log.LstdFlags)))

3.4. 综合上述示例:

package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
    "log"
    "os"
    "time"
)

func TestCron() {
    c := cron.New(cron.WithSeconds(), cron.WithChain(cron.SkipIfStillRunning(cron.DefaultLogger)), cron.WithLogger(
        cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags))))
    i := 1
    EntryID, err := c.AddFunc("*/5 * * * * *", func() {
        fmt.Println(time.Now(), "每5s一次----------------", i)
        time.Sleep(time.Second * 6)
        i++
    })
    fmt.Println(time.Now(), EntryID, err)

    c.Start()
    time.Sleep(time.Second * 30)
}
func main() {
    TestCron()
}

运行截图:

Golang cron 定时器和定时任务(简单示例)_第4张图片

得到结果, 第二次定时到的时候,函数还在time.sleep中,便跳过了->

3.5. 启动多个任务AddJob:

package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
    "time"
)

type Job1 struct {
}

func (t Job1) Run() {
    fmt.Println(time.Now(), "I'm Job1")
}

type Job2 struct {
}

func (t Job2) Run() {
    fmt.Println(time.Now(), "I'm Job2")
}

func TestCron() {
    c := cron.New(cron.WithSeconds())

    EntryID, err := c.AddJob("*/5 * * * * *", Job1{})
    fmt.Println(time.Now(), EntryID, err)

    EntryID, err = c.AddJob("*/10 * * * * *", Job2{})
    fmt.Println(time.Now(), EntryID, err)

    c.Start()
    time.Sleep(time.Second * 30)
}
func main() {
    TestCron()
}

运行截图:

Golang cron 定时器和定时任务(简单示例)_第5张图片

你可能感兴趣的:(go知识点杂烩,corn,golang,go)