濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別

Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別

熱門標(biāo)簽:地圖標(biāo)注免費(fèi)定制店 仙桃400電話辦理 不封卡外呼系統(tǒng) 上海極信防封電銷卡價(jià)格 寧波語(yǔ)音外呼系統(tǒng)公司 鄭州智能語(yǔ)音電銷機(jī)器人價(jià)格 湛江crm外呼系統(tǒng)排名 重慶慶云企業(yè)400電話到哪申請(qǐng) 宿遷便宜外呼系統(tǒng)代理商

不得不說(shuō),golang的sdk做了太多的東西,定時(shí)器在golang里實(shí)現(xiàn)起來(lái)非常的簡(jiǎn)單

兩種方式

  • NewTicker()
  • NewTimer()

代碼如下

NewTicker() 方式

func foo() {
 fmt.Println("foo() start.")
 time.Sleep(time.Second * 3)
 fmt.Println("foo() end.")
}

func TestTicker(t *testing.T) {
 ticker := time.NewTicker(time.Second * 2)
 // 清理計(jì)時(shí)器
 defer ticker.Stop()
 for {
  fmt.Println("ticker start ", time.Now().Format("15:04:05"))
  foo()
  -ticker.C
 }
}

運(yùn)行結(jié)果

 

NewTimer() 方式

func foo() {
 fmt.Println("foo() start.")
 time.Sleep(time.Second * 3)
 fmt.Println("foo() end.")
}

func TestTimer(t *testing.T) {
 timer := time.NewTimer(time.Second * 2)
 // 清理計(jì)時(shí)器
 defer timer.Stop()
 for {
  fmt.Println("ticker start ", time.Now().Format("15:04:05"))
  foo()
  -timer.C
 }
}

運(yùn)行結(jié)果

可以看到,就執(zhí)行了兩次就不動(dòng)了

原因:NewTicker() 啟動(dòng)后,會(huì)自己維護(hù)一個(gè)過(guò)期時(shí)間的通道(Channel)也就是代碼里的 -ticker.C 這句意思就是時(shí)間一到,ticker會(huì)通過(guò)管道發(fā)出一個(gè)信號(hào)給CPU,告訴CPU時(shí)間到了,該執(zhí)行定時(shí)里的方法了,信號(hào)發(fā)出后,ticker會(huì)自動(dòng)的重置定時(shí)的剩余時(shí)間,然后再進(jìn)行下一輪的發(fā)送信號(hào)執(zhí)行方法

但NewTimer()看源碼會(huì)發(fā)現(xiàn),它在sleep.go文件里定義的,也就是說(shuō)NewTimer()相當(dāng)于一個(gè)睡眠(延時(shí)執(zhí)行)。時(shí)間一到,timer會(huì)通過(guò)管道發(fā)出一個(gè)信號(hào)告訴CPU該執(zhí)行定時(shí)里的代碼了,然后這個(gè)管道就銷毀了,除非使用 timer.Reset(time.Duration * 2) 來(lái)重新激活這根管道,讓它重置定時(shí)的剩余時(shí)間,到下一輪定信號(hào)發(fā)出后,還要再次重置

所以在用定時(shí)時(shí),還是NewTicker()方便

值得一提的是,當(dāng)定時(shí)任務(wù)執(zhí)行時(shí)間過(guò)長(zhǎng)且超過(guò)定時(shí)的間隔時(shí)間時(shí),定時(shí)的間隔時(shí)間到了之后會(huì)等待定時(shí)任務(wù)執(zhí)行完才會(huì)進(jìn)行下一輪的定時(shí)任務(wù)

總結(jié)

到此這篇關(guān)于Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別的文章就介紹到這了,更多相關(guān)Golang定時(shí)器實(shí)現(xiàn)與區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • golang定時(shí)器和超時(shí)的使用詳解
  • Golang 定時(shí)器(Timer 和 Ticker),這篇文章就夠了
  • Golang中定時(shí)器的陷阱詳解
  • 用golang實(shí)現(xiàn)一個(gè)定時(shí)器任務(wù)隊(duì)列實(shí)例
  • golang中定時(shí)器cpu使用率高的現(xiàn)象詳析
  • golang time包下定時(shí)器的實(shí)現(xiàn)方法
  • Golang 定時(shí)器的終止與重置實(shí)現(xiàn)

標(biāo)簽:遼寧 青海 物業(yè)服務(wù) 儋州 電子產(chǎn)品 安康 西雙版納 海南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別》,本文關(guān)鍵詞  Golang,定時(shí)器,的,2種,實(shí)現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    固镇县| 白朗县| 萨嘎县| 新野县| 昭觉县| 南澳县| 措美县| 从江县| 丰顺县| 南城县| 兰州市| 西平县| 博客| 郸城县| 略阳县| 临清市| 永德县| 共和县| 辽阳县| 霞浦县| 九寨沟县| 绥芬河市| 抚远县| 株洲市| 甘孜县| 航空| 综艺| 曲沃县| 图们市| 怀远县| 旬阳县| 西畴县| 黄山市| 崇明县| 竹北市| 绥阳县| 郎溪县| 江油市| 察雅县| 宜都市| 理塘县|