一個系統(tǒng)中存在著大量的調(diào)度任務(wù),同時調(diào)度任務(wù)存在時間的滯后性,而大量的調(diào)度任務(wù)如果每一個都使用自己的調(diào)度器來管理任務(wù)的生命周期的話,浪費cpu的資源而且很低效。
站在用戶的角度思考問題,與客戶深入溝通,找到韶山網(wǎng)站設(shè)計與韶山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋韶山地區(qū)。本文來介紹 go-zero
中 延遲操作,它可能讓開發(fā)者調(diào)度多個任務(wù)時,只需關(guān)注具體的業(yè)務(wù)執(zhí)行函數(shù)和執(zhí)行時間「立即或者延遲」。而 延遲操作,通常可以采用兩個方案:
Timer
:定時器維護一個優(yōu)先隊列,到時間點執(zhí)行,然后把需要執(zhí)行的 task 存儲在 map 中collection
中的 timingWheel
,維護一個存放任務(wù)組的數(shù)組,每一個槽都維護一個存儲task的雙向鏈表。開始執(zhí)行時,計時器每隔指定時間執(zhí)行一個槽里面的tasks。
方案2把維護task從 優(yōu)先隊列 O(nlog(n))
降到 雙向鏈表 O(1)
,而執(zhí)行task也只要輪詢一個時間點的tasks O(N)
,不需要像優(yōu)先隊列,放入和刪除元素 O(nlog(n))
。
我們先看看 go-zero
中自己對 timingWheel
的使用 :
cache 中的 timingWheel
首先我們先來在 collection
的 cache
中關(guān)于 timingWheel
的使用:
timingWheel, err := NewTimingWheel(time.Second, slots, func(k, v interface{}) { key, ok := k.(string) if !ok { return } cache.Del(key) }) if err != nil { return nil, err } cache.timingWheel = timingWheel