定时器-基本使用

基本示例

package main

import (
    "context"
    "fmt"
    "github.com/gogf/gf/v2/os/gctx"
    "github.com/gogf/gf/v2/os/gtime"
    "github.com/gogf/gf/v2/os/gtimer"
    "time"
)

func main() {
    var (
        ctx = gctx.New()
        now = time.Now()
    )
    gtimer.AddTimes(ctx, time.Second, 10, func(ctx context.Context) {
        fmt.Println(gtime.Now(), time.Duration(time.Now().UnixNano()-now.UnixNano()))
        now = time.Now()
    })

    select {}
}

执行后,输出结果为:

2021-05-27 13:28:19 1.004516s
2021-05-27 13:28:20 997.262ms
2021-05-27 13:28:21 999.972ms
2021-05-27 13:28:22 1.00112s
2021-05-27 13:28:23 998.773ms
2021-05-27 13:28:24 999.957ms
2021-05-27 13:28:25 1.002468s
2021-05-27 13:28:26 997.468ms
2021-05-27 13:28:27 999.981ms
2021-05-27 13:28:28 1.002504s

单例任务

package main

import (
    "context"
    "github.com/gogf/gf/v2/os/gctx"
    "github.com/gogf/gf/v2/os/glog"
    "github.com/gogf/gf/v2/os/gtimer"
    "time"
)

func main() {
    var (
        ctx      = gctx.New()
        interval = time.Second
    )

    gtimer.AddSingleton(ctx, interval, func(ctx context.Context) {
        glog.Print(ctx, "doing")
        time.Sleep(5 * time.Second)
    })

    select {}
}

执行后,输出结果为:

2021-11-14 11:50:42.192 {189cwi9mo40cfp73guzhugo100tnuedg} doing
2021-11-14 11:50:48.190 {189cwi9mo40cfp73guzhugo100tnuedg} doing
2021-11-14 11:50:54.192 {189cwi9mo40cfp73guzhugo100tnuedg} doing
2021-11-14 11:51:00.189 {189cwi9mo40cfp73guzhugo100tnuedg} doing
...

延迟任务

延迟任务是指在指定时间后生效的定时任务。我们可以通过DelayAdd*相关方法实现延迟任务的创建。

package main

import (
    "context"
    "fmt"
    "github.com/gogf/gf/v2/os/gctx"
    "github.com/gogf/gf/v2/os/gtime"
    "github.com/gogf/gf/v2/os/gtimer"
    "time"
)

func main() {
    var (
        ctx      = gctx.New()
        delay    = time.Second
        interval = time.Second
    )
    fmt.Println("Start:", gtime.Now())
    gtimer.DelayAdd(
        ctx,
        delay,
        interval,
        func(ctx context.Context) {
            fmt.Println("Running:", gtime.Now())
        },
    )
    select {}
}

执行后,终端输出:

Start: 2021-05-27 13:26:02
Running: 2021-05-27 13:26:04
Running: 2021-05-27 13:26:05
Running: 2021-05-27 13:26:06
Running: 2021-05-27 13:26:07
Running: 2021-05-27 13:26:08
Running: 2021-05-27 13:26:09
Running: 2021-05-27 13:26:10
Running: 2021-05-27 13:26:11
...

SetTimeout与SetInterval

这两个方法来源于Javascript常用定时方法。其中SetTimeout用于创建只执行一次的定时任务,不过可以通过递归调用SetTimeout来实现无限间隔执行。SetIterval用于创建间隔执行不退出的定时任务。

package main

import (
    "context"
    "fmt"
    "github.com/gogf/gf/v2/os/gctx"
    "github.com/gogf/gf/v2/os/gtime"
    "github.com/gogf/gf/v2/os/gtimer"
    "time"
)

func main() {
    var (
        ctx      = gctx.New()
        timeout  = time.Second
        interval = time.Second
    )
    gtimer.SetTimeout(ctx, timeout, func(ctx context.Context) {
        fmt.Println("SetTimeout:", gtime.Now())
    })
    gtimer.SetInterval(ctx, interval, func(ctx context.Context) {
        fmt.Println("SetInterval:", gtime.Now())
    })
    select {}
}

执行后,终端输出:

SetInterval: 2021-05-27 13:20:50
SetTimeout: 2021-05-27 13:20:50
SetInterval: 2021-05-27 13:20:51
SetInterval: 2021-05-27 13:20:52
SetInterval: 2021-05-27 13:20:53
SetInterval: 2021-05-27 13:20:54
SetInterval: 2021-05-27 13:20:55
SetInterval: 2021-05-27 13:20:56
SetInterval: 2021-05-27 13:20:57
SetInterval: 2021-05-27 13:20:58
...

Exit退出

我们可以在定时任务中通过Exit方法强制退出定时任务的继续执行,该定时任务将会被从定时器中移除。

package main

import (
    "context"
    "fmt"
    "github.com/gogf/gf/v2/os/gctx"
    "github.com/gogf/gf/v2/os/gtime"
    "github.com/gogf/gf/v2/os/gtimer"
    "time"
)

func main() {
    var (
        ctx = gctx.New()
    )
    gtimer.SetInterval(ctx, time.Second, func(ctx context.Context) {
        fmt.Println("exit:", gtime.Now())
        gtimer.Exit()
    })
    select {}
}

执行后,终端输出:

exit: 2021-05-27 13:31:24