C語言中文網 目錄
首頁 > Go語言教程 > Go語言并發 閱讀:2,134

Go語言使用通道響應計時器的事件

Go 語言中的 time 包提供了計時器的封裝。由于 Go 語言中的通道和 goroutine 的設計,定時任務可以在 goroutine 中通過同步的方式完成,也可以通過在 goroutine 中異步回調完成。這里將分兩種用法進行例子展示。

一段時間之后(time.After)

延遲回調:
package main

import (
    "fmt"
    "time"
)

func main() {
    // 聲明一個退出用的通道
    exit := make(chan int)

    // 打印開始
    fmt.Println("start")

    // 過1秒后, 調用匿名函數
    time.AfterFunc(time.Second, func() {

        // 1秒后, 打印結果
        fmt.Println("one second after")

        // 通知main()的goroutine已經結束
        exit <- 0
    })

    // 等待結束
    <-exit
}
代碼說明如下:
  • 第 10 行,聲明一個退出用的通道,往這個通道里寫數據表示退出。
  • 第 16 行,調用 time.AfterFunc() 函數,傳入等待的時間和一個回調。回調使用一個匿名函數,在時間到達后,匿名函數會在另外一個 goroutine 中被調用。
  • 第 22 行,任務完成后,往退出通道中寫入數值表示需要退出。
  • 第 26 行,運行到此處時持續阻塞,直到 1 秒后第 22 行被執行后結束阻塞。

time.AfterFunc() 函數是在 time.After 基礎上增加了到時的回調,方便使用。

而 time.After() 函數又是在 time.NewTimer() 函數上進行的封裝,下面的例子展示如何使用 timer.NewTimer() 和 time.NewTicker()。

定點計時

計時器(Timer)的原理和倒計時鬧鐘類似,都是給定多少時間后觸發。打點器(Ticker)的原理和鐘表類似,鐘表每到整點就會觸發。這兩種方法創建后會返回 time.Ticker 對象和 time.Timer 對象,里面通過一個 C 成員,類型是只能接收的時間通道(<-chan Time),使用這個通道就可以獲得時間觸發的通知。

下面代碼創建一個打點器,每 500 毫秒觸發一起;創建一個計時器,2 秒后觸發,只觸發一次。

計時器:
package main

import (
    "fmt"
    "time"
)

func main() {

    // 創建一個打點器, 每500毫秒觸發一次
    ticker := time.NewTicker(time.Millisecond * 500)

    // 創建一個計時器, 2秒后觸發
    stopper := time.NewTimer(time.Second * 2)

    // 聲明計數變量
    var i int

    // 不斷地檢查通道情況
    for {

        // 多路復用通道
        select {
        case <-stopper.C:  // 計時器到時了

            fmt.Println("stop")

            // 跳出循環
            goto StopHere

        case <-ticker.C:  // 打點器觸發了
            // 記錄觸發了多少次
            i++
            fmt.Println("tick", i)
        }
    }

// 退出的標簽, 使用goto跳轉
StopHere:
    fmt.Println("done")

}
代碼說明如下:
  • 第 11 行,創建一個打點器,500 毫秒觸發一次,返回 *time.Ticker 類型變量。
  • 第 14 行,創建一個計時器,2 秒后返回,返回 *time.Timer 類型變量。
  • 第 17 行,聲明一個變量,用于累計打點器觸發次數。
  • 第 20 行,每次觸發后,select 會結束,需要使用循環再次從打點器返回的通道中獲取觸發通知。
  • 第 23 行,同時等待多路計時器信號。
  • 第 24 行,計時器信號到了。
  • 第 29 行,通過 goto 跳出循環。
  • 第 31 行,打點器信號到了,通過i自加記錄觸發次數并打印。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo