婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang中time.After的使用理解與釋放問題

Golang中time.After的使用理解與釋放問題

熱門標簽:高德地圖標注口訣 中國地圖標注省會高清 南通如皋申請開通400電話 學海導航地圖標注 西部云谷一期地圖標注 浙江高速公路地圖標注 廣州呼叫中心外呼系統 江西轉化率高的羿智云外呼系統 地圖標注的汽車標

Golang中的time.After的使用理解

關于在goroutine中使用time.After的理解, 新手在學習過程中的“此時此刻”的理解,錯誤還請指正。

先線上代碼:

package main

import (
 "fmt"
 "time"
)


func main() {
 //closeChannel()
 c := make(chan int)
 timeout := time.After(time.Second * 2) //
 t1 := time.NewTimer(time.Second * 3) // 效果相同 只執行一次
 var i int
 go func() {
 for {
 select {
 case -c:
 fmt.Println("channel sign")
 return
 case -t1.C: // 代碼段2
 fmt.Println("3s定時任務")
 case -timeout: // 代碼段1
 i++
 fmt.Println(i, "2s定時輸出")
 case -time.After(time.Second * 4): // 代碼段3
 fmt.Println("4s timeout。。。。") 
 default:    // 代碼段4
 fmt.Println("default")
 time.Sleep(time.Second * 1)
 }
 }
 }()
 time.Sleep(time.Second * 6)
 close(c)
 time.Sleep(time.Second * 2)
 fmt.Println("main退出")
}

主要有以上4點是我們平時遇到的。

首先遇到的問題是:

              如上的代碼情況下, 代碼段3處的case 永遠不執行, 無論main進程執行多久。這是為什么呢?

首先我們分析為啥不執行代碼段3, 而是程序一直執行的是default.  由此我們判斷:

                case - time.After(time.Second)  :  

                是本次監聽動作的超時時間, 意思就說,只有在本次select 操作中會有效, 再次select 又會重新開始計時(從當前時間+4秒后), 但是有default ,那case 超時操作,肯定執行不到了。

                那么問題就簡單了我們預先定義了計時操作:

                case - timeout:

                    在goroutine開始前, 我們記錄了時間,在此時間3s之后進行操作。相當于定時任務, 并且只執行一次。 代碼段1和代碼段2 實現的結果都相同

針對以上問題解決后,我寫了一個小案例:

package main

import (
 "fmt"
 "time"
)

//發送者
func sender(c chan int) {
 for i := 0; i  100; i++ {
 c - i
 if i >= 5 {
 time.Sleep(time.Second * 7)
 } else {
 time.Sleep(time.Second)
 }
 }
}

func main() {
 c := make(chan int)
 go sender(c)
 timeout := time.After(time.Second * 3)
 for {
 select {
 case d := -c:
 fmt.Println(d)
 case -timeout:
 fmt.Println("這是定時操作任務 >>>>>")
 case dd := -time.After(time.Second * 3):
 fmt.Println(dd, "這是超時*****")
 }

 fmt.Println("for end")
 }
}

執行結果:

要注意的是,雖然執行到i == 6時, 堵塞了,并且執行了超時操作, 但是下次select 依舊去除的是6

因為通道中已經發送了6,如果未取出,程序堵塞。

GOLANG中time.After釋放的問題

在謝大群里看到有同學在討論time.After泄漏的問題,就算時間到了也不會釋放,瞬間就驚呆了,忍不住做了試驗,結果發現應該沒有這么的恐怖的,是有泄漏的風險不過不算是泄漏,先看API的說明:

// After waits for the duration to elapse and then sends the current time
// on the returned channel.
// It is equivalent to NewTimer(d).C.
// The underlying Timer is not recovered by the garbage collector
// until the timer fires. If efficiency is a concern, use NewTimer
// instead and call Timer.Stop if the timer is no longer needed.
func After(d Duration) -chan Time {
 return NewTimer(d).C
}

提到了一句The underlying Timer is not recovered by the garbage collector,這句挺嚇人不會被GC回收,不過后面還有條件until the timer fires,說明fire后是會被回收的,所謂fire就是到時間了,寫個例子證明下壓壓驚:

package main

import "time"

func main() {
 for {
  - time.After(10 * time.Nanosecond)
 }
}

顯示內存穩定在5.3MB,CPU為161%,肯定被GC回收了的。當然如果放在goroutine也是沒有問題的,一樣會回收:

package main

import "time"

func main() {
 for i := 0; i  100; i++ {
  go func(){
   for {
    - time.After(10 * time.Nanosecond)
   }
  }()
 }
 time.Sleep(1 * time.Hour)
}

只是資源消耗會多一點,CPU為422%,內存占用6.4MB。因此:

Remark: time.After(d)在d時間之后就會fire,然后被GC回收,不會造成資源泄漏的。

那么API所說的If efficieny is a concern, user NewTimer instead and call Timer.Stop是什么意思呢?這是因為一般time.After會在select中使用,如果另外的分支跑得更快,那么timer是不會立馬釋放的(到期后才會釋放),比如這種:

select {
 case time.After(3*time.Second):
  return errTimeout
 case packet := packetChannel:
  // process packet.
}

如果packet非常多,那么總是會走到下面的分支,上面的timer不會立刻釋放而是在3秒后才能釋放,和下面代碼一樣:

package main

import "time"

func main() {
 for {
  select {
  case -time.After(3 * time.Second):
  default:
  }
 }
}

這個時候,就相當于會堆積了3秒的timer沒有釋放而已,會不斷的新建和釋放timer,內存會穩定在2.8GB,這個當然就不是最好的了,可以主動釋放:

package main

import "time"

func main() {
 for {
  t := time.NewTimer(3*time.Second)

  select {
  case - t.C:
  default:
   t.Stop()
  }
 }
}

這樣就不會占用2.8GB內存了,只有5MB左右。因此,總結下這個After的說明:

  • GC肯定會回收time.After的,就在d之后就回收。一般情況下讓系統自己回收就好了。
  • 如果有效率問題,應該使用Timer在不需要時主動Stop。大部分時候都不用考慮這個問題的。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Go語言利用time.After實現超時控制的方法詳解

標簽:貴州 許昌 東營 吐魯番 常州 保定 曲靖 德宏

巨人網絡通訊聲明:本文標題《Golang中time.After的使用理解與釋放問題》,本文關鍵詞  Golang,中,time.After,的,使用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang中time.After的使用理解與釋放問題》相關的同類信息!
  • 本頁收集關于Golang中time.After的使用理解與釋放問題的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品视频在线免费看| 成人av电影在线| 成人av电影在线| 久久久三级国产网站| 久久精品国产精品亚洲综合| 日韩视频一区在线观看| 麻豆免费看一区二区三区| 日韩精品一区二| 国产在线不卡一区| 亚洲国产精品v| 色婷婷精品大在线视频| 亚洲国产视频在线| 欧美一个色资源| 国产v日产∨综合v精品视频| 国产精品家庭影院| 欧美日韩aaaaaa| 国产在线精品国自产拍免费| 国产精品美女一区二区在线观看| a在线欧美一区| 亚洲国产日韩一区二区| 日韩精品在线一区二区| 懂色av噜噜一区二区三区av| 一区二区三国产精华液| 精品美女在线播放| 成人h精品动漫一区二区三区| 亚洲欧美一区二区三区极速播放| 欧美日韩国产首页| 国产老肥熟一区二区三区| 亚洲欧美国产三级| 精品美女一区二区三区| www.日韩av| 乱中年女人伦av一区二区| 日韩一区中文字幕| 精品日韩一区二区三区| 一本久道久久综合中文字幕 | 成人h动漫精品一区二区| 亚洲天堂av一区| 欧美精品丝袜久久久中文字幕| 国产精品自拍av| 日韩欧美国产三级| 国产色91在线| 国产美女娇喘av呻吟久久| 91精品国产综合久久精品app| 国产精品毛片大码女人| 欧美日韩视频在线观看一区二区三区| 久久99热国产| 午夜成人免费电影| 亚洲精品国产精品乱码不99| 久久影院午夜片一区| 欧美日韩黄色一区二区| av不卡免费在线观看| 韩国一区二区在线观看| 午夜婷婷国产麻豆精品| 一区二区在线免费| 国产精品视频你懂的| 久久精品亚洲精品国产欧美kt∨| 日韩美女主播在线视频一区二区三区| 欧美羞羞免费网站| 欧美性感一区二区三区| 91麻豆蜜桃一区二区三区| av在线播放一区二区三区| 国产成人av电影在线观看| 国产一区二区在线看| 久草这里只有精品视频| 精品写真视频在线观看| 激情文学综合插| 蜜桃av噜噜一区| 美女网站色91| 久久99精品久久久久久| 蜜臀av一级做a爰片久久| 日韩精品久久久久久| 亚洲成人一区二区在线观看| 亚洲成人激情av| 男女男精品视频网| 精品一区二区三区在线观看 | 国产麻豆成人精品| 国产精品88888| 大美女一区二区三区| 成人黄色777网| 欧美在线一二三四区| 久久精品一二三| 精品美女被调教视频大全网站| 欧美一区二区免费观在线| 欧美一级二级三级乱码| 久久久久国产精品免费免费搜索| 欧美激情一区二区在线| 中文字幕中文字幕一区二区| 亚洲男人的天堂在线观看| 亚洲高清视频的网址| 久久国产精品第一页| 国产**成人网毛片九色| 91一区一区三区| 91精品欧美综合在线观看最新| 久久久久国产精品麻豆ai换脸| 国产精品久久久久7777按摩| 亚洲电影激情视频网站| 狠狠色丁香久久婷婷综| 91蝌蚪国产九色| 制服视频三区第一页精品| 久久精品人人做人人综合| 日韩理论片一区二区| 麻豆精品在线看| jlzzjlzz国产精品久久| 日韩一级黄色大片| 国产精品麻豆久久久| 日韩中文字幕av电影| 成人sese在线| 欧美大白屁股肥臀xxxxxx| 亚洲欧洲性图库| 久久99精品久久久久| 欧美色视频一区| 国产亚洲一区字幕| 秋霞午夜鲁丝一区二区老狼| 一区二区三区欧美久久| 精品一区二区免费看| 欧美亚洲一区二区在线观看| 中文无字幕一区二区三区| 欧美aaaaaa午夜精品| 欧美日韩一二三区| 亚洲欧洲日本在线| 国产乱人伦偷精品视频免下载| 欧美日韩大陆一区二区| 亚洲一区二区在线观看视频| 成人精品国产免费网站| 久久久噜噜噜久久中文字幕色伊伊 | 国产精品免费视频一区| 日韩高清在线一区| 欧美中文字幕一区二区三区亚洲| 国产欧美精品一区| 久久99久久99| 777色狠狠一区二区三区| 亚洲综合偷拍欧美一区色| 91理论电影在线观看| 亚洲欧美影音先锋| 成人av在线影院| 欧美激情在线免费观看| 国产综合色在线| 久久亚洲捆绑美女| 国产电影一区二区三区| 精品成人在线观看| 久久99久久99小草精品免视看| 欧美一级午夜免费电影| 美日韩黄色大片| 欧美日精品一区视频| 亚洲成av人片在www色猫咪| 欧美中文字幕一区| 丝袜美腿一区二区三区| 欧美一级二级在线观看| 日韩精品福利网| 欧美年轻男男videosbes| 日韩中文字幕区一区有砖一区 | 91精品久久久久久久久99蜜臂| 一区二区三区高清不卡| 在线观看av一区二区| 亚洲成a人v欧美综合天堂下载 | 欧美猛男男办公室激情| 日韩—二三区免费观看av| 91精品国产综合久久精品性色| 激情欧美日韩一区二区| 国产精品色哟哟网站| 色吧成人激情小说| 日韩国产欧美三级| 国产欧美日本一区二区三区| 91丝袜高跟美女视频| 午夜精品久久久久久久久久久| 日韩欧美国产午夜精品| 国产一区二区三区电影在线观看| 中文字幕高清一区| 欧美日韩午夜影院| 国产精品一品视频| 亚洲综合免费观看高清完整版在线 | 91豆麻精品91久久久久久| 无码av免费一区二区三区试看 | 国产91精品在线观看| 亚洲精品伦理在线| 欧美哺乳videos| 99精品久久免费看蜜臀剧情介绍| 午夜精品久久久久久久久| 亚洲国产精品黑人久久久| 欧美精选一区二区| 99久久精品国产毛片| 免费在线看成人av| 亚洲欧美激情小说另类| 国产亚洲精品bt天堂精选| 欧美精品欧美精品系列| 99精品热视频| 国产精品一级在线| 免费在线视频一区| 亚洲精品福利视频网站| 久久精品亚洲一区二区三区浴池| 在线播放欧美女士性生活| 91免费版在线看| 成人免费不卡视频| 国产另类ts人妖一区二区| 日韩精品乱码av一区二区| 亚洲午夜影视影院在线观看| 日韩毛片在线免费观看| 国产精品免费看片| 中文一区二区完整视频在线观看| 欧美精品一区二区三区蜜桃|