前言
在業(yè)務(wù)中,我們經(jīng)常需要基于定時(shí)任務(wù)來觸發(fā)來實(shí)現(xiàn)各種功能。比如TTL會(huì)話管理、鎖、定時(shí)任務(wù)(鬧鐘)或更復(fù)雜的狀態(tài)切換等等。百納網(wǎng)主要給大家介紹了關(guān)于Golang定時(shí)器陷阱的相關(guān)內(nèi)容,所謂陷阱,就是它不是你認(rèn)為的那樣,這種認(rèn)知誤差可能讓你的軟件留下隱藏Bug。剛好Timer就有3個(gè)陷阱,我們會(huì)講
1)Reset的陷阱和
2)通道的陷阱,
3)Stop的陷阱與Reset的陷阱類似,自己探索吧。
下面話不多說了,來一起看看詳細(xì)的介紹吧
Reset的陷阱在哪
Timer.Reset()
函數(shù)的返回值是bool類型,我們看一個(gè)問題三連:
成功:一段時(shí)間之后定時(shí)器超時(shí),收到超時(shí)事件。
失?。撼晒Φ姆疵?,我們收不到那個(gè)事件。對(duì)于失敗,我們應(yīng)當(dāng)做些什么,確保我們的定時(shí)器發(fā)揮作用。
Reset的返回值是不是這個(gè)意思?
通過查看文檔和實(shí)現(xiàn),Timer.Reset()
的返回值并不符合我們的預(yù)期,這就是誤差。它的返回值不代表重設(shè)定時(shí)器成功或失敗,而是在表達(dá)定時(shí)器在重設(shè)前的狀態(tài):
所以,當(dāng)Reset返回false時(shí),我們并不能認(rèn)為一段時(shí)間之后,超時(shí)不會(huì)到來,實(shí)際上可能會(huì)到來,定時(shí)器已經(jīng)生效了。
跳過陷阱,再遇陷阱
如何跳過前面的陷阱,讓Reset符合我們的預(yù)期功能呢?直接忽視Reset的返回值好了,它不能幫助你達(dá)到預(yù)期的效果。
真正的陷阱是Timer的通道,它和我們預(yù)期的成功、失敗密切相關(guān)。我們所期望的定時(shí)器設(shè)置失敗,通常只和通道有關(guān):設(shè)置定時(shí)器前,定時(shí)器的通道Timer.C中是否已經(jīng)有數(shù)據(jù)。
接下來解釋為何失敗只與通道中是否存在超時(shí)事件有關(guān)。
定時(shí)器的緩存通道大小只為1,無法多存放超時(shí)事件,看源碼。
// NewTimer creates a new Timer that will send // the current time on its channel after at least duration d. func NewTimer(d Duration) *Timer { c := make(chan Time, 1) // 緩存通道大小為1 t := &Timer{ C: c, r: runtimeTimer{ when: when(d), f: sendTime, arg: c, }, } startTimer(&t.r) return t }
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
名稱欄目:Golang中定時(shí)器的陷阱詳解-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://sd-ha.com/article24/cdhjje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)公司、電子商務(wù)、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容