欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析go中Ticker,Timer和Tick的用法與區(qū)別

 更新時間:2023年10月22日 08:04:22   作者:nil  
在go面試的時候,面試官經(jīng)常會問time包的Ticker,Timer以及Tick的區(qū)別,一般在超時控制的時候用的比較多,今天就跟隨小編一起來詳細學(xué)一下這幾個的區(qū)別吧

寫在前面

在go面試的時候,面試官經(jīng)常會問time包的Ticker,Timer以及Tick的區(qū)別,一般在超時控制的時候用的比較多。今天就來詳細學(xué)一下這幾個的區(qū)別

Ticker

Ticker是周期性定時器,即周期性的觸發(fā)一個事件,它會以一個間隔(interval)往channel發(fā)送一個事件(當(dāng)前時間),而channel的接收者可以以固定的時間間隔從channel中讀取事件。通過Ticker本身提供的管道將事件傳遞出去

示例

func main() {
    t1 := time.NewTicker(3 * time.Second)
    defer t1.Stop()
    for {
       select {
       case <-t1.C:
          fmt.Printf("%s\n", time.Now())
       }
    }
}

結(jié)果

2023-10-21 18:53:30.629901 +0800 CST m=+3.001061072
2023-10-21 18:53:33.629444 +0800 CST m=+6.000526969
2023-10-21 18:53:36.629429 +0800 CST m=+9.000436237

通過NewTicker創(chuàng)建一個Ticker,然后通過通過for+select實現(xiàn)定時執(zhí)行。記住Ticker一定要調(diào)用Stop方法,關(guān)閉chan,否則容易造成內(nèi)存泄露。Ticker最常用的2個函數(shù)就是NewTickerStop。

Ticker主要用于定期循環(huán)執(zhí)行某一個操作。

Timer

用于執(zhí)行一次性任務(wù)。在指定時間間隔之后再下chan發(fā)送一個事件(當(dāng)前時間)

func main() {
    t1 := time.NewTimer(3 * time.Second)
    defer t1.Stop()
    for {
       t1.Reset(3 * time.Second)
       select {
       case <-t1.C:
          fmt.Printf("%s\n", time.Now())
       }
    }
}

用Timer也能實現(xiàn)Ticker循環(huán)執(zhí)行的功能,但是每次必須調(diào)用Reset方法,否則會死鎖,因為Timer只會執(zhí)行一次。不過Timer一般不用于循環(huán)執(zhí)行,它用于超時控制,比如調(diào)用某個rpc,如果超過3s則終止調(diào)用。

示例

func main() {
    t1 := time.NewTimer(3 * time.Second)
    defer t1.Stop()

    ctx, cancel := mockRPC()
    select {
    case <-ctx.Done():
       fmt.Printf("rpc end\n")
       break
    case <-t1.C:
       // t1時間到了,rpc還沒執(zhí)行完,則執(zhí)行cancel()并退出
       fmt.Printf("%s\n", time.Now())
       cancel()
    }
}

// mockRPC. 異步執(zhí)行5s鐘,如果已經(jīng)結(jié)束了則停止執(zhí)行
func mockRPC() (context.Context, context.CancelFunc) {
    ctx, cancel := context.WithCancel(context.Background())
    go func() {
       for i := 0; i < 5; i++ {
          select {
          case <-ctx.Done():
             break
          default:
             fmt.Printf("%d\n", i)
             time.Sleep(time.Second)
          }
       }
    }()

    return ctx, cancel
}

結(jié)果

0
1
2
2023-10-21 19:18:53.565153 +0800 CST m=+3.000558307

Tick

Tick其實最簡單,直接看它的源代碼

func Tick(d Duration) <-chan Time {
    if d <= 0 {
       return nil
    }
    return NewTicker(d).C
}

發(fā)現(xiàn)Tick其實就是一個Ticker的C,所以使用起來更方便

func main() {
    t1 := time.Tick(3 * time.Second)
    for {
       select {
       case <-t1:
          fmt.Printf("%s\n", time.Now())
       }
    }
}

但是有一個問題,由于Tick()函數(shù)沒有返回Ticker,我們無法關(guān)閉它,所以這個t1對應(yīng)的Ticker用于無法關(guān)閉,會造成內(nèi)存泄露。一般不推薦用Tick,直接使用Ticker就好了。應(yīng)該只能在程序結(jié)束的時候會回收內(nèi)存,但是Tick和Ticker區(qū)別這么小,不知道為什么要定義Tick()這個函數(shù)。

總結(jié)

  • Ticker是一個定時器。
  • Timer是一個延遲執(zhí)行器,也可以通過Reset()來實現(xiàn)定時器。
  • Tick()是一個函數(shù),返回Ticker的chan,不推薦使用。

到此這篇關(guān)于淺析go中Ticker,Timer和Tick的用法與區(qū)別的文章就介紹到這了,更多相關(guān)go Ticker Timer Tick內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go標準庫日志打印及同時輸出到控制臺與文件

    Go標準庫日志打印及同時輸出到控制臺與文件

    Go語言內(nèi)置的log包實現(xiàn)了簡單的日志服務(wù),下面這篇文章主要給大家介紹了關(guān)于Go標準庫日志打印及同時輸出到控制臺與文件的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • Go web入門Go pongo2模板引擎

    Go web入門Go pongo2模板引擎

    這篇文章主要為大家介紹了Go web編程入門Go pongo2模板引擎使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Go中跨域Cors中間件的實現(xiàn)

    Go中跨域Cors中間件的實現(xiàn)

    本文主要介紹了Go中跨域Cors中間件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • golang協(xié)程關(guān)閉踩坑實戰(zhàn)記錄

    golang協(xié)程關(guān)閉踩坑實戰(zhàn)記錄

    協(xié)程(coroutine)是Go語言中的輕量級線程實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于golang協(xié)程關(guān)閉踩坑的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • Go映射的使用

    Go映射的使用

    Go提供了另一個重要的數(shù)據(jù)類型,稱為map,它將唯一鍵映射到值,本文主要介紹了Go映射的使用,包括聲明映射、初始化映射、操作映射等,感興趣的可以了解一下
    2023-11-11
  • GO開發(fā)編輯器安裝圖文詳解

    GO開發(fā)編輯器安裝圖文詳解

    這篇文章主要介紹了GO開發(fā)編輯器安裝,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Go Sentinel 動態(tài)數(shù)據(jù)源配置指南(示例詳解)

    Go Sentinel 動態(tài)數(shù)據(jù)源配置指南(示例詳解)

    本文介紹了如何使用Go語言配置Sentinel的動態(tài)數(shù)據(jù)源,并通過本地文件和Nacos兩種方式實現(xiàn)動態(tài)配置,通過這種方式,可以靈活地管理和更新限流規(guī)則,提升系統(tǒng)的穩(wěn)定性和響應(yīng)速度,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Systemd集成Golang二進制程序的方法

    Systemd集成Golang二進制程序的方法

    這篇文章主要介紹了Systemd集成Golang二進制程序的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-10-10
  • Go語言{}大括號的特殊用法實例探究

    Go語言{}大括號的特殊用法實例探究

    這篇文章主要為大家介紹了Go語言{}大括號的特殊用法實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • golang并發(fā)執(zhí)行的幾種方式小結(jié)

    golang并發(fā)執(zhí)行的幾種方式小結(jié)

    本文主要介紹了golang并發(fā)執(zhí)行的幾種方式小結(jié),主要包括了Channel,WaitGroup ,Context,使用這三種機制中的一種或者多種可以達到并發(fā)控制很好的效果,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08

最新評論