好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Golang 定時器的終止與重置實現

Golang 定時器的終止與重置實現

熱門標簽:揚州電銷外呼系統軟件 電腦外呼系統輻射大嗎 智能語音電銷的機器人 如何利用高德地圖標注家 開通400電話申請流程 百度地圖標注位置網站 武漢百應人工智能電銷機器人 400手機電話免費辦理 上海企業外呼系統排名

昨日有讀者對定時器的終止有疑問,今天我們來聊一聊定時器的終止與重置吧!

定時器是一種通過設置一項任務,在未來的某個時刻執行該任務的機制。

定時器的種類通常只有兩種,一種是只執行一次的延時模式,一種是每隔一段時間執行一次的間隔模式。

在現代編程語言中,定時器幾乎是標配。除了設置定時器外,還需要有提供定時器的方法。

比如在 JavaScript 中,提供了 setTimeout、setInterval、clearTimeout 和 clearInterval 四個 API,相比較而言是比較簡單的。Go 語言中定時器的 API 就比較完善,所有的 API 都在 time 包中。

先看下面一段代碼:

func main() {
    timer := time.NewTimer(3 * time.Second)
    fmt.Println(time.Now(),"炸彈將于3秒后引爆")
​
​
    timer.Stop()
    fmt.Println("定時炸彈已拆除,定時器失效")
​
    
    t := -timer.C
    fmt.Println("炸彈引爆于",t)
}

先來看看運行結果

2021-08-25 10:08:34.706412 +0800 CST m=+0.023017601 炸彈將于3秒后引爆
定時炸彈已拆除,定時器失效
fatal error: all goroutines are asleep - deadlock!

我們可以趁定時器時間未到而使用Stop來將定時器終止,如果定時器已被叫停,其時間管道永遠讀不出數據了,如果強制讀取,就會出現死鎖。因為使用Stop就是停止往管道里面寫數據了,或者可以這樣說,就是管道里面的數據已經讀完了,使用time.NewTimer(3 * time.Second)就是往管道里面寫數據。

我們在來看一個有趣的例子。

func main()  {
    timer := time.NewTimer(1 * time.Second)
    fmt.Println(time.Now())
​
    time.Sleep(2 * time.Second)
    fmt.Println(time.Now())
​
    timer.Reset(10*time.Second)
    fmt.Println("炸彈引爆于",-timer.C)
}

現在,思考一下,炸彈是什么時候引爆的!

想知道答案嗎?不要著急,不要著急,休息,休息一會兒,答案馬上揭曉

我們來看看運行結果吧:

2021-08-25 10:15:16.8406335 +0800 CST m=+0.014999801
2021-08-25 10:15:18.906213 +0800 CST m=+2.080579301
炸彈引爆于 2021-08-25 10:15:17.8522233 +0800 CST m=+1.026589601

是不是和你想的一樣?如果不是,沒關系,聽我細細道來。
因為time.sleep()是讓主協程睡大覺,而timer.C讀的那條管道的協程是獨立的。所以你讓主協程睡大覺并不會影響定時器的計時,就相當于一個定時炸彈要引爆了,你馬上把手表的時間往后調,但是定時炸彈上的數字時間不會因為手表上的時間往后調而往后調。

誒!這時你會說我不是重置了嗎?
但是定時器超時了,那么重置就不起作用了,你想一想,定時炸彈都爆炸了,你去重置還有效嗎?
如果我們將定時器的時間調到3秒,就是這樣:

timer := time.NewTimer(3 * time.Second)

那么輸出結果會怎樣?

2021-08-25 10:26:21.1299417 +0800 CST m=+0.020983301
2021-08-25 10:26:23.2191128 +0800 CST m=+2.110154401
炸彈引爆于 2021-08-25 10:26:33.227692 +0800 CST m=+12.118733601

設置定時器后2秒,主協程才執行到Reset(),所以炸彈是在設置定時器12秒后才爆炸的。
有趣的是,當我查看Reset()的源碼時,發現了這樣一段注釋:

// Reset should be invoked only on stopped or expired timers with drained channels.
// If a program has already received a value from t.C, the timer is known
// to have expired and the channel drained, so t.Reset can be used directly.
// If a program has not yet received a value from t.C, however,
// the timer must be stopped and—if Stop reports that the timer expired
// before being stopped—the channel explicitly drained:
//
//  if !t.Stop() {
//      -t.C
//  }
//  t.Reset(d)

根據我的理解,大意是這樣的,如果計時器已經過期,并且t.C已經被讀完了,那么可以直接使用Reset。而如果程序Reset之前未從t.C中讀取過值的話,就需要調用Stop來結束定時器,才能使用reset。

到此這篇關于Golang 定時器的終止與重置實現的文章就介紹到這了,更多相關Golang 定時器終止與重置內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Golang定時器的2種實現方法與區別
  • golang定時器和超時的使用詳解
  • Golang 定時器(Timer 和 Ticker),這篇文章就夠了
  • Golang中定時器的陷阱詳解
  • 用golang實現一個定時器任務隊列實例
  • golang中定時器cpu使用率高的現象詳析
  • golang time包下定時器的實現方法

標簽:延邊 張掖 新余 武漢 嘉峪關 江西 黑龍江 宜賓

巨人網絡通訊聲明:本文標題《Golang 定時器的終止與重置實現》,本文關鍵詞  Golang,定時器,的,終止,與,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang 定時器的終止與重置實現》相關的同類信息!
  • 本頁收集關于Golang 定時器的終止與重置實現的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 国产精品丰满对白在线观看| 邻居阿的丝袜让我好爽| 久久久91人妻无码Av蜜桃电影| 欧美黑人又粗又大的性格特点| 国产VA精品免费观看剧情介绍 | 大众浴池摄像高清摄像头| 亚洲精品国产欧美第5页| 喜欢被老男人吃奶摸下面| 免费国产黄线在线观看软件| 偷窥女厕美女洗澡秘?18| 日本片免费观看一区二区| 挺进女下属后菊| 韩国色情三级理伦电影在线| 男女互舔下面| 欧美性视频网站| J8一进一出又大又硬视频| 久久午夜无码鲁丝片秋霞欧美AV6| tubixxxx| 免费无码又爽又刺激A片暗夜| 91人妻精品久久久久久| 大胸美女裸照| 农村亂伦BBw| 好看伦理片最新的伦理片| 亚洲欧美日韩色图| 少妇洁白第二部分37| 青青久久99久久99久久999| 91又大又爽又黄无码A片| 色呦呦下载| 午夜久久久久久久久久一区二区| 高潮?国产?喷水?白网站| 天降女子~从2楼掉下了| 91色桃| 一区视频免费观看| 活色生香短篇小说全文| 男人扒开腿狂躁女人樱花免费视频| 欧美精品九九99久久在免费线| 一级黄色夫妻性生活片| 爱啪啪影视| 亚洲AV天堂精品AV在线| 欧美曰韩性受一区AV片| 日本边添边爱边摸边做边爱|