雷火电竞-中国电竞赛事及体育赛事平台

<i id='dlg5m56l'><tr id='xhstnman'><dt id='mwlbwd16'><q id='nhk5nx9z'><span id='ew5f07wk'><b id='b4wt8yy1'><form id='28zm8zfe'><ins id='7nc6463d'></ins><ul id='uoq5n8d3'></ul><sub id='91xweile'></sub></form><legend id='pczbbwki'></legend><bdo id='nd4kswbu'><pre id='vqhx2ure'><center id='9t90368o'></center></pre></bdo></b><th id='5q5tvv65'></th></span></q></dt></tr></i><div class="l4l4wckh0sl" id='l59x8ljb'><tfoot id='p8eioytu'></tfoot><dl id='v9xmdhmz'><fieldset id='nogpknoe'></fieldset></dl></div>
  1. <tfoot id='8q7rnakh'></tfoot>
  2. <legend id='t95ez6bq'><style id='o4o23p3a'><dir id='0oaqjalp'><q id='hl6v0kkm'></q></dir></style></legend>
  3. <small id='c7rpa6jv'></small><noframes id='fkfsa1wv'>

    • <bdo id='xzt4pbv8'></bdo><ul id='qnt2g6mz'></ul>

      歡迎來(lái)到入門(mén)教程網(wǎng)!

      GO語(yǔ)言

      當(dāng)前位置:主頁(yè) > 網(wǎng)絡(luò)編程 > GO語(yǔ)言 >

      go語(yǔ)言定時(shí)器教學(xué) go語(yǔ)言定時(shí)任務(wù)

      來(lái)源:本站原創(chuàng)|時(shí)間:2023-04-02|欄目:GO語(yǔ)言|點(diǎn)擊:

      Go語(yǔ)言基于Etcd實(shí)現(xiàn)的定時(shí)任務(wù)

      利用 Etcd 的Lease租約特性來(lái)實(shí)現(xiàn)定時(shí)功能,同時(shí)通過(guò)Watch機(jī)制來(lái)實(shí)現(xiàn)多節(jié)點(diǎn)情況下只有一個(gè)節(jié)點(diǎn)執(zhí)行該任務(wù)。通過(guò)定時(shí)任務(wù)庫(kù) Cron 的時(shí)間字符串解析器Parser來(lái)解析任務(wù)執(zhí)行時(shí)間。

      Etcd

      Cron

      源碼鏈接

      golang 定時(shí)器,啟動(dòng)的時(shí)候執(zhí)行一次,以后每天晚上12點(diǎn)執(zhí)行,怎么實(shí)現(xiàn)

      ????func?startTimer(f?func())?{

      ????????go?func()?{

      ????????????for?{

      ????????????????f()

      ????????????????now?:=?time.Now()

      ????????????????//?計(jì)算下一個(gè)零點(diǎn)

      ????????????????next?:=?now.Add(time.Hour?*?24)

      ????????????????next?=?time.Date(next.Year(),?next.Month(),?next.Day(),?0,?0,?0,?0,?next.Location())

      ????????????????t?:=?time.NewTimer(next.Sub(now))

      ????????????????-t.C

      ????????????}

      ????????}()

      ????}

      Golang-基于TimeingWheel定時(shí)器

      在linux下實(shí)現(xiàn)定時(shí)器主要有如下方式

      在這當(dāng)中 基于時(shí)間輪方式實(shí)現(xiàn)的定時(shí)器 時(shí)間復(fù)雜度最小,效率最高,然而我們可以通過(guò) 優(yōu)先隊(duì)列 實(shí)現(xiàn)時(shí)間輪定時(shí)器。

      優(yōu)先隊(duì)列的實(shí)現(xiàn)可以使用最大堆和最小堆,因此在隊(duì)列中所有的數(shù)據(jù)都可以定義排序規(guī)則自動(dòng)排序。我們直接通過(guò)隊(duì)列中 pop 函數(shù)獲取數(shù)據(jù),就是我們按照自定義排序規(guī)則想要的數(shù)據(jù)。

      在 Golang 中實(shí)現(xiàn)一個(gè)優(yōu)先隊(duì)列異常簡(jiǎn)單,在 container/head 包中已經(jīng)幫我們封裝了,實(shí)現(xiàn)的細(xì)節(jié),我們只需要實(shí)現(xiàn)特定的接口就可以。

      下面是官方提供的例子

      因?yàn)閮?yōu)先隊(duì)列底層數(shù)據(jù)結(jié)構(gòu)是由二叉樹(shù)構(gòu)建的,所以我們可以通過(guò)數(shù)組來(lái)保存二叉樹(shù)上的每一個(gè)節(jié)點(diǎn)。

      改數(shù)組需要實(shí)現(xiàn) Go 預(yù)先定義的接口 Len , Less , Swap , Push , Pop 和 update 。

      timerType結(jié)構(gòu)是定時(shí)任務(wù)抽象結(jié)構(gòu)

      首先的 start 函數(shù),當(dāng)創(chuàng)建一個(gè) TimeingWheel 時(shí),通過(guò)一個(gè) goroutine 來(lái)執(zhí)行 start ,在start中for循環(huán)和select來(lái)監(jiān)控不同的channel的狀態(tài)

      通過(guò)for循環(huán)從隊(duì)列中取數(shù)據(jù),直到該隊(duì)列為空或者是遇見(jiàn)第一個(gè)當(dāng)前時(shí)間比任務(wù)開(kāi)始時(shí)間大的任務(wù), append 到 expired 中。因?yàn)閮?yōu)先隊(duì)列中是根據(jù) expiration 來(lái)排序的,

      所以當(dāng)取到第一個(gè)定時(shí)任務(wù)未到的任務(wù)時(shí),表示該定時(shí)任務(wù)以后的任務(wù)都未到時(shí)間。

      當(dāng) getExpired 函數(shù)取出隊(duì)列中要執(zhí)行的任務(wù)時(shí),當(dāng)有的定時(shí)任務(wù)需要不斷執(zhí)行,所以就需要判斷是否該定時(shí)任務(wù)需要重新放回優(yōu)先隊(duì)列中。 isRepeat 是通過(guò)判斷任務(wù)中 interval 是否大于 0 判斷,

      如果大于0 則,表示永久就生效。

      防止外部濫用,阻塞定時(shí)器協(xié)程,框架又一次封裝了timer這個(gè)包,名為 timer_wapper 這個(gè)包,它提供了兩種調(diào)用方式。

      參數(shù)和上面的參數(shù)一樣,只是在第三個(gè)參數(shù)中使用了任務(wù)池,將定時(shí)任務(wù)放入了任務(wù)池中。定時(shí)任務(wù)的本身執(zhí)行就是一個(gè) put 操作。

      至于put以后,那就是 workers 這個(gè)包管理的了。在 worker 包中, 也就是維護(hù)了一個(gè)任務(wù)池,任務(wù)池中的任務(wù)會(huì)有序的執(zhí)行,方便管理。

          <legend id='1vm7yn8l'><style id='xm18qv93'><dir id='8z3c5yga'><q id='48mcx0sk'></q></dir></style></legend>

          • <tfoot id='o1jax6dh'></tfoot>
              <tbody id='tx5nsby8'></tbody>

            <small id='01oxdnpg'></small><noframes id='vjppnlgz'>

              <bdo id='qa7hyztr'></bdo><ul id='603vdou0'></ul>

                <i id='nz9m3dic'><tr id='99uhvysj'><dt id='q5cjhx9d'><q id='v8snqvr9'><span id='1xv9vsdj'><b id='5n8xx87a'><form id='25m0mr7x'><ins id='2xlvgzdf'></ins><ul id='izxgg7zb'></ul><sub id='v3g0ymp6'></sub></form><legend id='tn8vnqtk'></legend><bdo id='vinf8n8w'><pre id='ygj76e5r'><center id='pxjxuxqu'></center></pre></bdo></b><th id='blws51de'></th></span></q></dt></tr></i><div class="l4l4wckh0sl" id='ogt8txer'><tfoot id='cwq7zgm9'></tfoot><dl id='x6fml7xc'><fieldset id='dm432bi3'></fieldset></dl></div>
              • 上一篇:沒(méi)有了

                欄    目:GO語(yǔ)言

                下一篇:go語(yǔ)言主要應(yīng)用 go語(yǔ)言主要應(yīng)用在哪些領(lǐng)域

                本文標(biāo)題:go語(yǔ)言定時(shí)器教學(xué) go語(yǔ)言定時(shí)任務(wù)

                本文地址:http://www.jygsgssxh.com/a1/wangluobiancheng/GOyuyan/17069.html

                網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

                如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

                聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

                Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有

                    <legend id='wthfqyn2'><style id='lac2ixfk'><dir id='smdygzzz'><q id='qeo4jkuo'></q></dir></style></legend>
                    • <bdo id='9s5vj86f'></bdo><ul id='ds3ulzvl'></ul>
                  1. <i id='7pdzj7q4'><tr id='yzfi73ma'><dt id='yuy76m77'><q id='mspyo6hq'><span id='8466w9td'><b id='qjh01vmc'><form id='tq42ziy5'><ins id='egroxrvo'></ins><ul id='c8cuhonk'></ul><sub id='h8cm2acq'></sub></form><legend id='rvzf6ngy'></legend><bdo id='73z8yjre'><pre id='3wyfluwj'><center id='5i06efr1'></center></pre></bdo></b><th id='tax1w56a'></th></span></q></dt></tr></i><div class="l4l4wckh0sl" id='jop1q6ed'><tfoot id='8gp0fym4'></tfoot><dl id='f6ajftnz'><fieldset id='q1z8zg5v'></fieldset></dl></div>

                    <tfoot id='9tk4xz2e'></tfoot>

                  2. <small id='8bvhl6ig'></small><noframes id='dohlciaw'>