<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## ticker實現原理 Ticker數據結構與Timer除名字不同外完全一樣。 源碼包`src/time/tick.go:Ticker`定義了其數據結構: ~~~go type Ticker struct { C <-chan Time // The channel on which the ticks are delivered. r runtimeTimer } ~~~ Ticker只有兩個成員: * C: 管道,上層應用根據此管道接收事件; * r: runtime定時器,該定時器即系統管理的定時器,對上層應用不可見; 這里應該按照層次來理解Ticker數據結構,Ticker.C即面向Ticker用戶的,Ticker.r是面向底層的定時器實現 ### 創建Ticker 我們來看創建Ticker的實現,非常簡單: ~~~go func NewTicker(d Duration) *Ticker { if d <= 0 { panic(errors.New("non-positive interval for NewTicker")) } // Give the channel a 1-element time buffer. // If the client falls behind while reading, we drop ticks // on the floor until the client catches up. c := make(chan Time, 1) t := &Ticker{ C: c, r: runtimeTimer{ when: when(d), period: int64(d), // Ticker跟Timer的重要區就是提供了period這個參數,據此決定timer是一次性的,還是周期性的 f: sendTime, arg: c, }, } startTimer(&t.r) return t } ~~~ NewTicker()只是構造了一個Ticker,然后把Ticker.r通過startTimer()交給系統協程維護。 其中period為事件觸發的周期。 其中sendTime()方法便是定時器觸發時的動作: ~~~go func sendTime(c interface{}, seq uintptr) { select { case c.(chan Time) <- Now(): default: } } ~~~ sendTime接收一個管道作為參數,其主要任務是向管道中寫入當前時間。 創建Ticker時生成的管道含有一個緩沖區(`make(chan Time, 1)`),但是Ticker觸發的事件卻是周期性的,如果管道中的數據沒有被取走,那么sendTime()也不會阻塞,而是直接退出,帶來的后果是本次事件會丟失。 綜上,創建一個Ticker示意圖如下: ![](https://img.kancloud.cn/67/7a/677a0e3bb2726f15c90af60f0057275c_770x323.png) ### 停止Ticker 停止Ticker,只是簡單的把Ticker從系統協程中移除。函數主要實現如下: ~~~go func (t *Ticker) Stop() { stopTimer(&t.r) } ~~~ stopTicker()即通知系統協程把該Ticker移除,即不再監控。系統協程只是移除Ticker并不會關閉管道,以避免用戶協程讀取錯誤。 與Timer不同的是,Ticker停止時沒有返回值,即不需要關注返回值,實際上返回值也沒啥用途。 綜上,停止一個Ticker示意圖如下: ![](https://img.kancloud.cn/d4/56/d456071d82467035cc63e20ff8b2809b_770x323.png) Ticker沒有重置接口,也即Ticker創建后不能通過重置修改周期。 需要格外注意的是Ticker用完后必須主動停止,否則會產生資源泄露,會持續消耗CPU資源。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看