中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go語言設置定時器的方法

發布時間:2020-12-16 14:18:13 來源:億速云 閱讀:343 作者:小新 欄目:編程語言

小編給大家分享一下go語言設置定時器的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

go語言設置定時器的方法:1、通過“time.NewTicker()”方法創建,其中ticker會按照設定的間隔時間觸發;2、通過“time.NewTimer()”方法創建,其中timer只會執行一詞;3、使用“After()”來創建。

Go語言中定時器的使用

GO語言在time包中提供了三種定時器的使用方式:

1.第一種:ticker

// A Ticker holds a channel that delivers `ticks' of a clock
// at intervals.
type Ticker struct {
	C <-chan Time // The channel on which the ticks are delivered.
	r runtimeTimer
}

通過 time.NewTicker() 創建,這種類型,ticker會不斷的按照設定的間隔時間觸發,除非主動終止運行。

2.第二種:timer

// The Timer type represents a single event.
// When the Timer expires, the current time will be sent on C,
// unless the Timer was created by AfterFunc.
// A Timer must be created with NewTimer or AfterFunc.
type Timer struct {
	C <-chan Time
	r runtimeTimer
}

通過 time.NewTimer() 創建,這種類型,timer只會執行一次,當然,可以在執行完以后通過調用 timer.Reset() 讓定時器再次工作,并可以更改時間間隔。

3.第三種:After()

// After waits for the duration to elapse and then sends the current time
// on the returned channel.
// It is equivalent to NewTimer(d).C.
// The underlying Timer is not recovered by the garbage collector
// until the timer fires. If efficiency is a concern, use NewTimer
// instead and call Timer.Stop if the timer is no longer needed.
func After(d Duration) <-chan Time {
	return NewTimer(d).C
}

從代碼可以看到,After()其實是Timer的一個語法糖。


下面通過代碼演示一下三種方式的使用:

1.Ticker

ticker := time.NewTicker(time.Second * 1) // 運行時長
    ch := make(chan int)
    go func() {
        var x int
        for x < 10 {
            select {
            case <-ticker.C:
                x++
                fmt.Printf("%d\n", x)
            }
        }
        ticker.Stop()
        ch <- 0
    }()
    <-ch                                    // 通過通道阻塞,讓任務可以執行完指定的次數。

該ticker每1秒觸發一次,即ticker.C中每一秒會有一個內容加入,最后通過向ch中寫入數字,讓程序解除阻塞,繼續執行。

2.Timer

timer := time.NewTimer(time.Second * 1) // timer 只能按時觸發一次,可通過Reset()重置后繼續觸發。
    go func() {
        var x int
        for {
            select {
            case <-timer.C:
                x++
                fmt.Printf("%d,%s\n", x, time.Now().Format("2006-01-02 15:04:05"))
                if x < 10 {
                    timer.Reset(time.Second * 2)
                } else {
                    ch <- x
                }
            }
        }
    }()
    <-ch

3.After()

// 阻塞一下,等待主進程結束
    tt := time.NewTimer(time.Second * 10)
    <-tt.C
    fmt.Println("over.")

    <-time.After(time.Second * 4)
    fmt.Println("再等待4秒退出。tt 沒有終止,打印出 over 后會看見在繼續執行...")
    tt.Stop()
    <-time.After(time.Second * 2)
    fmt.Println("tt.Stop()后, tt 仍繼續執行,只是關閉了 tt.C 通道。")

4.我們可以利用這些基本的方法,設計自己的定時任務管理。

type jobFunc2 func(j *job)

type job struct {
    jf     jobFunc2
    params map[string]interface{}
    ch     chan int
}

func NewJob() *job {
    return &job{
        params: make(map[string]interface{}),
        ch:     make(chan int),
    }
}

func (j *job) Run(t time.Duration) {
    ticker := time.NewTicker(time.Second * t)
    go func() {
        for {
            select {
            case <-ticker.C:
                j.jf(j)
            case <-j.ch:
                fmt.Println("收到結束指令")
                ticker.Stop()
                break
            }
        }
    }()

}

func main() {
    j := NewJob()
    j.jf = func(jj *job) {
        fmt.Println("定時任務執行...", time.Now().Format("15:04:05 2006-02-01"), jj.params)
    }
    j.params["p1"] = "第一個參數"
    j.params["p2"] = 100
    j.Run(1)

    // 阻塞一下,等待主進程結束
    tt := time.NewTimer(time.Second * 10)
    <-tt.C
    fmt.Println("over.")

    <-time.After(time.Second * 4)
    fmt.Println("再等待4秒退出。tt 沒有終止,打印出 over 后會看見在繼續執行...")
    tt.Stop()
    <-time.After(time.Second * 2)
    fmt.Println("tt.Stop()后, tt 仍繼續執行,只是關閉了 tt.C 通道。")
}

部分執行結果截圖:

go語言設置定時器的方法

最后補充一下,通過channel去終止任務的執行。

// 阻塞一下,等待主進程結束
    tt := time.NewTimer(time.Second * 10)
    <-tt.C
    fmt.Println("over.")

    <-time.After(time.Second * 4)
    fmt.Println("再等待4秒退出。tt 沒有終止,打印出 over 后會看見在繼續執行...")
    tt.Stop()
    <-time.After(time.Second * 2)
    fmt.Println("tt.Stop()后, tt 仍繼續執行,只是關閉了 tt.C 通道。")
    j.ch <- 0
    <-time.After(time.Second * 2)
    fmt.Println("又等了2秒鐘...這兩秒鐘可以看到 tt 沒干活了...")

go語言設置定時器的方法

在GO語言編寫中,要熟練使用 channel

以上是“go語言設置定時器的方法”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

云南省| 青铜峡市| 赤峰市| 蚌埠市| 上林县| 聂荣县| 洛扎县| 宝丰县| 郑州市| 广灵县| 灵山县| 河西区| 清丰县| 九龙坡区| 吴桥县| 浪卡子县| 佳木斯市| 自治县| 淮阳县| 天柱县| 新巴尔虎左旗| 清水县| 关岭| 灵丘县| 方正县| 怀宁县| 龙海市| 五莲县| 康平县| 都安| 潼南县| 安宁市| 沂水县| 孝义市| 石家庄市| 拉萨市| 达州市| 霞浦县| 定襄县| 郁南县| 龙江县|