Go 定時器和斷續器

來源:互聯網
上載者:User

標籤:go 觸發器 續斷器

1、定時器

Go語言中定時器可以實現在指定時間點執行特定的事件,定時器的實質是單向通道,time.Timer結構體類型中有一個time.Time類型的單向chan,具體聲明如下:

type Timer struct {    C <-chan Time    r runtimeTimer}

只能通過兩種方式來進行初始化:time.NewTimer()和time.AfterFunc(),看如下代碼:

package mainimport (    "fmt"    "time")func main() {    // NewTimer方法接受一個時間段d表示自此刻起經曆d時間段後,定時器到期;傳回值為*Timer類型,到期後將到期時的時間寫入*Timer的C(chan time.Time)欄位中    t := time.NewTimer(2 * time.Second)    now := time.Now()    fmt.Printf("Now time: %v\n", now)    // 改行代碼會阻塞當前的goroutine,直到t.C中傳入一個元素    expire := <-t.C    fmt.Printf("Expire time: %v\n", expire)}
package mainimport (    "fmt"    "time")func main() {    var t *time.Timer    f := func() {        fmt.Printf("Expriation time: %v\n", time.Now())        fmt.Printf("C`s length: %v\n", len(t.C))    }    // 在定時器到期時執行一個自訂的無接受參數和輸出參數的函數    t = time.AfterFunc(1*time.Second, f)    // 為了結果輸出完全    time.Sleep(2 * time.Second)}

如果不使用時器的Stop()和Reset()方法,可以直接用定時器的快捷方法,如下:

package mainimport (    "fmt"    "time")func main() {    fmt.Printf("Now time:%v\n", time.Now())    c := <-time.After(5 * time.Second)    fmt.Printf("TimeOut. Now :%v\n", c)}

如果在定時器到期之前,使用Stop(),那麼就不會再有元素寫入通道內,那麼等待接受該通道元素所在的goroutine將被阻塞,恢複被停止的定時器的唯一途徑是使用Reset()方法重設;定時器可以複用,尤其是在for迴圈中複用可以減少程式的資源佔用,這時需要Reset()方法來重設定時器。


2、斷續器

Go提供了迴圈多次的執行某一任務的工具,續斷器,實質是單向通道,time.結構體類型中有一個time.Time類型的單向chan,具體聲明如下:

type Ticker struct {    C <-chan Time     r runtimeTimer}

續斷器使用NewTicker()來初始化,代碼如下:

package mainimport (    "fmt"    "time")func main() {    ticks := time.NewTicker(30 * time.Second)    tick := ticks.C    go func() {        // for...range...相當於從通道取一個元素        for _ = range tick {            fmt.Printf("%vExecute the task.\n", time.Now())            // 再次執行接受操作時,由於通道內暫時沒有值,就會被阻塞,直到下次觸發到期            _, ok := <-tick            if !ok {                break            }        }    }()    fmt.Printf("Now: %v.\n", time.Now())    time.Sleep(5 * time.Minute)    fmt.Println("Done.")}

如果不使用續斷器的Stop()方法,可以直接使用續斷器的快捷方法,如下

tick := <-time.Tick(5 * time.Second)

本文出自 “勇敢向前,堅決向左” 部落格,請務必保留此出處http://quenlang.blog.51cto.com/4813803/1735366

Go 定時器和斷續器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.