91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Go 定時器和斷續器

發布時間:2020-07-19 01:54:53 來源:網絡 閱讀:6284 作者:quenlang 欄目:開發技術

1、定時器

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

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

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

package main

import (
    "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 main

import (
    "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 main

import (
    "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 main

import (
    "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)
向AI問一下細節

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

AI

渑池县| 临西县| 泰兴市| 罗江县| 威远县| 江达县| 阳朔县| 洮南市| 万安县| 舒兰市| 烟台市| 平谷区| 龙山县| 东光县| 商丘市| 道孚县| 新巴尔虎右旗| 高邮市| 唐山市| 顺昌县| 南岸区| 阿坝| 舟山市| 天门市| 谢通门县| 瓮安县| 宁强县| 托里县| 元谋县| 彭州市| 合水县| 尖扎县| 敦煌市| 舞阳县| 蚌埠市| 涞源县| 洛扎县| 抚顺县| 德江县| 富裕县| 南雄市|