GoFrame gtimer-基本使用

2022-04-09 13:51 更新

基本示例

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

執(zhí)行后,輸出結(jié)果為:

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

單例任務(wù)

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

執(zhí)行后,輸出結(jié)果為:

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
...

延遲任務(wù)

延遲任務(wù)是指在指定時(shí)間后生效的定時(shí)任務(wù)。我們可以通過(guò)?DelayAdd*?相關(guān)方法實(shí)現(xiàn)延遲任務(wù)的創(chuàng)建。

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

執(zhí)行后,終端輸出:

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

這兩個(gè)方法來(lái)源于?Javascript?常用定時(shí)方法。其中?SetTimeout?用于創(chuàng)建只執(zhí)行一次的定時(shí)任務(wù),不過(guò)可以通過(guò)遞歸調(diào)用?SetTimeout?來(lái)實(shí)現(xiàn)無(wú)限間隔執(zhí)行。?SetIterval?用于創(chuàng)建間隔執(zhí)行不退出的定時(shí)任務(wù)。

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

執(zhí)行后,終端輸出:

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退出

我們可以在定時(shí)任務(wù)中通過(guò)?Exit?方法強(qiáng)制退出定時(shí)任務(wù)的繼續(xù)執(zhí)行,該定時(shí)任務(wù)將會(huì)被從定時(shí)器中移除。

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

執(zhí)行后,終端輸出:

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


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)