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