µ±Ç°Î»ÖãºÖ÷Ò³ > ²é¿´ÄÚÈÝ

ÄÑÊÜ£¬Éú²ú Go timer.After ÄÚ´æй¶֮ʹ£¡

·¢²¼Ê±¼ä£º2021-06-05 00:00| ÓРλÅóÓѲ鿴

¼ò½é£ºÎ¢ÐÅËÑË÷¡¾ ÄÔ×Ó½ø¼åÓãÁË ¡¿¹Ø×¢ÕâÒ»Ö»±¬¸Î¼åÓã¡£±¾ÎÄ GitHub github.com/eddycjy/blog ÒÑÊÕ¼£¬ÓÐÎÒµÄϵÁÐÎÄÕ¡¢×ÊÁϺͿªÔ´ Go ͼÊé¡£ ´ó¼ÒºÃ£¬ÎÒÊǼåÓã¡£ Ç°¼¸Ìì·ÖÏíÁËһƪ Go timer Ô´Âë½âÎöµÄÎÄÕ¡¶ÄÑÒÔ¼ÝÔ¦µÄ Go timer£¬Ò»ÎÄ´øÄã²Î͸¼ÆʱÆ÷µÄ°ÂÃØ¡·¡£¡­¡­
΢ÐÅËÑË÷¡¾ÄÔ×Ó½ø¼åÓãÁË¡¿¹Ø×¢ÕâÒ»Ö»±¬¸Î¼åÓã¡£±¾ÎÄ GitHub github.com/eddycjy/blog ÒÑÊÕ¼£¬ÓÐÎÒµÄϵÁÐÎÄÕ¡¢×ÊÁϺͿªÔ´ Go ͼÊé¡£

´ó¼ÒºÃ£¬ÎÒÊǼåÓã¡£

Ç°¼¸Ìì·ÖÏíÁËһƪ Go timer Ô´Âë½âÎöµÄÎÄÕ¡¶ÄÑÒÔ¼ÝÔ¦µÄ Go timer£¬Ò»ÎÄ´øÄã²Î͸¼ÆʱÆ÷µÄ°ÂÃØ¡·¡£

ÔÚÆÀÂÛÇøÓÐС»ï°éÌáµ½Á˾­µäµÄ timer.After й¶ÎÊÌ⣬ϣÍûÎÒÄÜÁÄÁÄ£¬ÕâÊÇÒ»¸ö²»Äܲ»ÖªµÄÒ»¸ö´ó ¡°¿Ó¡±¡£

½ñÌìÕâƪÎÄÕ¼åÓã¾Í´ø´ó¼ÒÀ´ÑÐÌÖÒ»ÏÂÕâ¸öÎÊÌâ¡£

timer.After

½ñÌìÊÇÄÐÖ÷½ÇÊÇGo ±ê×¼¿â time ËùÌṩµÄ After ·½·¨¡£º¯ÊýÇ©ÃûÈçÏ£º

func After(d Duration) <-chan Time 

¸Ã·½·¨¿ÉÒÔÔÚÒ»¶¨Ê±¼ä£¨¸ù¾ÝËù´«ÈëµÄ Duration£©ºóÖ÷¶¯·µ»Ø time.Time ÀàÐ굀 channel ÏûÏ¢¡£

ÔÚ³£¼ûµÄ³¡¾°Ï£¬ÎÒÃÇ»á»ùÓÚ´Ë·½·¨×öһЩ¼ÆʱÆ÷Ïà¹ØµÄ¹¦ÄÜ¿ª·¢£¬Àý×ÓÈçÏ£º

func main() {
    ch := make(chan string)
    go func() {
        time.Sleep(time.Second * 3)
        ch <- "ÄÔ×Ó½ø¼åÓãÁË"
    }()

    select {
    case _ = <-ch:
    case <-time.After(time.Second * 1):
        fmt.Println("¼åÓã³öÈ¥ÁË£¬³¬Ê±ÁË£¡£¡£¡")
    }
}

ÔÚÔËÐÐ 1 ÃëÖÓºó£¬Êä³ö½á¹û£º

¼åÓã³öÈ¥ÁË£¬³¬Ê±ÁË£¡£¡£¡

ÉÏÊö³ÌÐòÔÚÔÚÔËÐÐ 1 ÃëÖӺ󽫴¥·¢ time.After ·½·¨µÄ¶¨Ê±ÏûÏ¢·µ»Ø£¬Êä³öÁ˳¬Ê±µÄ½á¹û¡£

¿ÓÔÚÄÄÀï

´ÓÀý×ÓÀ´¿´Ëƺõ·Ç³£Õý³££¬Ò²Ã»Ê²Ã´ ¡°¿Ó¡± µÄÑù×Ó¡£ÄѵÀÊÇ timer.After ·½·¨µÄÐé»Îһǹ£¿

ÎÒÃÇÔÙ¿´Ò»¸ö²»ÏñÊÇÓÐÎÊÌâÀý×Ó£¬ÕâÔÚ Go ¹¤³ÌÖо­³£ÄÜ¿´¼û£¬Ö»ÊÇ´ó¼Ò¶¼Ã»Ôõô¹Ø×¢¡£

´úÂëÈçÏ£º

func main() {
    ch := make(chan int, 10)
    go func() {
        in := 1
        for {
            in++
            ch <- in
        }
    }()
    
    for {
        select {
        case _ = <-ch:
            // do something...
            continue
        case <-time.After(3 * time.Minute):
            fmt.Printf("ÏÖÔÚÊÇ£º%d£¬ÎÒÄÔ×Ó½ø¼åÓãÁË£¡", time.Now().Unix())
        }
    }
}

ÔÚÉÏÊö´úÂëÖУ¬ÎÒÃǹ¹ÔìÁËÒ»¸ö for+select+channel µÄÒ»¸ö¾­µäµÄ´¦Àíģʽ¡£

ͬʱÔÚ select+case Öе÷ÓÃÁË time.After ·½·¨×ö³¬Ê±¿ØÖÆ£¬±ÜÃâÔÚ channel µÈ´ýʱ×èÈû¹ý¾Ã£¬Òý·¢ÆäËûÎÊÌâ¡£

¿´ÉÏÈ¥¶¼Ã»Ê²Ã´ÎÊÌ⣬µ«ÊÇϸÐÄÒ»¿´¡£ÔÚÔËÐÐÁËÒ»¶Îʱ¼äºó£¬´Ö±©µÄÀûÓà top ÃüÁîÒ»¿´£º

ÔËÐÐÁËÒ»»áºó£¬10+GB

ÎÒµÄ Go ¹¤³ÌµÄÄÚ´æÕ¼Óþ¹È»ÒѾ­´ïµ½ÁË 10+GB Ö®¸ß£¬²¢ÇÒ»¹ÔÚ³ÖÐøÔö³¤£¬·Ç³£¿ÉÅ¡£

ÔÚËùÉèÖõij¬Ê±Ê±¼äµ½´ïºó£¬Go ¹¤³ÌµÄÄÚ´æÕ¼ÓÃËƺõһʱ°ë»áҲûÓÐÒª»ØÍËÏÂÈ¥µÄÑù×Ó£¬Õ⣬µ½µ×·¢ÉúÁËʲôÊ£¿

Ϊʲô

±§×ÅÒ»Á³ã±ƵļåÓ㣬ÎÒĬĬµÄÌͳöÎÒÔçÒÑÂñºÃµÄ PProf£¬ÕâÊÇ Go ÓïÑÔÖÐ×îÇ¿µÄÐÔÄÜ·ÖÎöÆÊÎö¹¤¾ß£¬ÔÚÎÒ³ö°æµÄ ¡¶Go ÓïÑÔ±à³ÌÖ®Âá·ÌØÒâÓл¨Á¿Õ½ڵÄƪ·ù´óÃæ»ý½«½²½â¹ý¡£

ÔÚ Go ÓïÑÔÖУ¬PProf ÊÇÓÃÓÚ¿ÉÊÓ»¯ºÍ·ÖÎöÐÔÄÜ·ÖÎöÊý¾ÝµÄ¹¤¾ß£¬PProf ÒÔ profile.proto ¶ÁÈ¡·ÖÎöÑù±¾µÄ¼¯ºÏ£¬²¢Éú³É±¨¸æÒÔ¿ÉÊÓ»¯²¢°ïÖú·ÖÎöÊý¾Ý£¨Ö§³ÖÎı¾ºÍͼÐα¨¸æ£©¡£

ÎÒÃÇÖ±½ÓÓà go tool pprof ·ÖÎö Go ¹¤³ÌÖк¯ÊýÄÚ´æÉêÇëÇé¿ö£¬ÈçÏÂͼ£º

PProf

´ÓͼÀ´·ÖÎö£¬¿ÉÒÔ·¢ÏÖÊDz»¶ÏµØÔÚµ÷Óà time.After£¬´Ó¶øµ¼Ö¼ÆʱÆ÷ time.NerTimer µÄ²»¶Ï´´½¨ºÍÄÚ´æÉêÇë¡£

Õâ¾Í·Ç³£Ææ¹ÖÁË£¬ÒòΪÎÒÃÇµÄ Go ¹¤³ÌÀïÖ»Óм¸ÐдúÂëÓë time Ïà¹ØÁª£º

func main() {
    ...
    for {
        select {
        ...
        case <-time.After(3 * time.Minute):
            fmt.Printf("ÏÖÔÚÊÇ£º%d£¬ÎÒÄÔ×Ó½ø¼åÓãÁË£¡", time.Now().Unix())
        }
    }
}

ÓÉÓÚ Demo ×ã¹»µÄС£¬ÎÒÃÇÏàÐÅÕâ¾ÍÊÇÎÊÌâ´úÂ룬µ«Ô­ÒòÊÇʲôÄØ£¿

Ô­ÒòÔÚÓÚ for+select£¬ÔÙ¼ÓÉÏ time.After µÄ×éºÏ»áµ¼ÖÂÄÚ´æй¶¡£ÒòΪ forÔÚÑ­»·Ê±£¬¾Í»áµ÷Óö¼ select Óï¾ä£¬Òò´ËÔÚÿ´Î½øÐÐ select ʱ£¬¶¼»áÖØгõʼ»¯Ò»¸öȫеļÆʱÆ÷£¨Timer£©¡£

ÎÒÃÇÕâ¸ö¼ÆʱÆ÷£¬ÊÇÔÚ 3 ·ÖÖÓºó²Å»á±»´¥·¢È¥Ö´ÐÐijЩÊ£¬µ«ÖصãÔÚÓÚ¼ÆʱÆ÷¼¤»îºó£¬È´ÓÖ·¢ÏÖºÍ select Ö®¼äûÓÐÒýÓùØϵÁË£¬Òò´ËºÜºÏÀíµÄÒ²¾Í±» GC ¸øÇåÀíµôÁË£¬ÒòΪûÓÐÈËÐèÒª ¡°ÎÒ¡± ÁË¡£

ÒªÃüµÄ»¹ÔÚºóÍ·£¬±»Å×ÆúµÄ time.After µÄ¶¨Ê±ÈÎÎñ»¹ÊÇÔÚʱ¼ä¶ÑÖеȴý´¥·¢£¬ÔÚ¶¨Ê±ÈÎÎñδµ½ÆÚ֮ǰ£¬ÊDz»»á±» GC Çå³ýµÄ¡£

µ«ºÜ¿Éϧ£¬Ëû ¡°ÓÀÔ¶¡± ²»»áµ½ÆÚÁË£¬Ò²¾ÍÊÇΪʲôÎÒÃÇµÄ Go ¹¤³ÌÄÚ´æ»á²»¶Ï쭸ߣ¬ÆäʵÊÇ time.After ²úÉúµÄÄÚ´æ¹Â¶ùÃǵ¼ÖÂÁËй¶¡£

½â¾ö°ì·¨

¼ÈÈ»ÎÒÃÇÖªµÀÁËÎÊÌâµÄ¸ùÒò´úÂëÊDz»¶ÏµÄÖظ´´´½¨ time.After£¬ÓÖû·¨ÍêÕûµÄ×ßÍêÊͷŵıջ·£¬Äǽâ¾ö°ì·¨Ò²¾ÍÓÐÁË¡£

¸Ä½øºóµÄ´úÂëÈçÏ£º

func main() {
    timer := time.NewTimer(3 * time.Minute)
    defer timer.Stop()
    
    ...
    for {
        select {
        ...
        case <-timer.C:
            fmt.Printf("ÏÖÔÚÊÇ£º%d£¬ÎÒÄÔ×Ó½ø¼åÓãÁË£¡", time.Now().Unix())
        }
    }
}

¾­¹ýÒ»¶Îʱ¼äµÄÃþÓãºó£¬ÔÙʹÓà PProf ½øÐвɼ¯ºÍ²é¿´£º

PProf

Go ½ø³ÌµÄ¸÷ÏîÖ¸±êÕý³££¬ÍêºÃµÄ½â¾öÁËÕâ¸öÄÚ´æ鶵ÄÎÊÌâ¡£

×ܽá

ÔÚ½ñÌìÕâƪÎÄÕÂÖУ¬ÎÒÃǽéÉÜÁ˱ê×¼¿â time µÄ»ù±¾³£¹æʹÓã¬Í¬Ê±Õë¶Ô Go С»ï°éËùÌá³öµÄ time.After ·½·¨µÄʹÓò»µ±£¬Ëùµ¼ÖµÄÄÚ´æй¶½øÐÐÁËÖØÏÖºÍÎÊÌâ½âÎö¡£

Æä¸ùÒò¾ÍÔÚÓÚ Go ÓïÑÔʱ¼ä¶ÑµÄ´¦Àí»úÖƺͳ£¹æ for+select+time.After ×éºÏµÄÏÂÒâʶд·¨Ëùµ¼ÖµÄй¶¡£

ͻȻÏëÆðÎÒÓÐÒ»¸öÅóÓÑÔÚ¹«Ë¾ÀïÓп´µ½¹ýÀàËƵĴúÂ룬ÔÚÉú²ú²È¹ýÕâ¸ö¿Ó£¬°ëÒ¹±»¸æ¾¯×¥ÆðÀ´...

²»ÖªµÀÄãÔÚÈÕ³£¹¤×÷ÖÐÓÐûÓÐÓöµ½¹ýÏàËƵÄÎÊÌâÄØ£¬»¶Ó­ÁôÑÔÇøÆÀÂۺͽ»Á÷¡£

ÎÄÕ³ÖÐø¸üУ¬¿ÉÒÔ΢ÐÅËÑ¡¾ÄÔ×Ó½ø¼åÓãÁË¡¿ÔĶÁ£¬»Ø¸´¡¾000¡¿ÓÐÎÒ×¼±¸µÄÒ»Ïß´ó³§ÃæÊÔËã·¨Ìâ½âºÍ×ÊÁÏ£»±¾ÎÄ GitHub github.com/eddycjy/blog ÒÑÊÕ¼£¬»¶Ó­ Star ´ß¸ü¡£

±¾ÎÄת×ÔÍøÂ磬°æȨ¹éÔ­×÷ÕßËùÓУ¬Ô­ÎÄÁ´½Ó£ºhttps://segmentfault.com/a/1190000040105436
±¾Õ¾²¿·ÖÄÚÈÝתÔØÓÚÍøÂ磬°æȨ¹éÔ­×÷ÕßËùÓУ¬×ªÔØ֮ĿµÄÔÚÓÚ´«²¥¸ü¶àÓÅÐã¼¼ÊõÄÚÈÝ£¬ÈçÓÐÇÖȨÇëÁªÏµQQ/΢ÐÅ£º153890879ɾ³ý£¬Ð»Ð»£¡
ÉÏһƪ£ºË¼·ñ´ø¸øÎҵļ¼Êõ³É³¤¡¾Ë¼·ñ9ÖÜÄê¡¿ ÏÂһƪ£ºÃ»ÓÐÁË

ÍƼöͼÎÄ

  • ÖÜÅÅÐÐ
  • ÔÂÅÅÐÐ
  • ×ÜÅÅÐÐ

Ëæ»úÍƼö