΢ÐÅËÑË÷¡¾ÄÔ×Ó½ø¼åÓãÁË¡¿¹Ø×¢ÕâÒ»Ö»±¬¸Î¼åÓã¡£±¾ÎÄ GitHub github.com/eddycjy/blog ÒÑÊÕ¼£¬ÓÐÎÒµÄϵÁÐÎÄÕ¡¢×ÊÁϺͿªÔ´ Go ͼÊé¡£
´ó¼ÒºÃ£¬ÎÒÊǼåÓã¡£
Ç°¼¸Ìì·ÖÏíÁËһƪ Go timer Ô´Âë½âÎöµÄÎÄÕ¡¶ÄÑÒÔ¼ÝÔ¦µÄ Go timer£¬Ò»ÎÄ´øÄã²Î͸¼ÆʱÆ÷µÄ°ÂÃØ¡·¡£
ÔÚÆÀÂÛÇøÓÐС»ï°éÌáµ½Á˾µäµÄ 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
ÃüÁîÒ»¿´£º
ÎÒµÄ Go ¹¤³ÌµÄÄÚ´æÕ¼Óþ¹È»ÒѾ´ïµ½ÁË 10+GB Ö®¸ß£¬²¢ÇÒ»¹ÔÚ³ÖÐøÔö³¤£¬·Ç³£¿ÉÅ¡£
ÔÚËùÉèÖõij¬Ê±Ê±¼äµ½´ïºó£¬Go ¹¤³ÌµÄÄÚ´æÕ¼ÓÃËƺõһʱ°ë»áҲûÓÐÒª»ØÍËÏÂÈ¥µÄÑù×Ó£¬Õ⣬µ½µ×·¢ÉúÁËʲôÊ£¿
±§×ÅÒ»Á³ã±ƵļåÓ㣬ÎÒĬĬµÄÌͳöÎÒÔçÒÑÂñºÃµÄ PProf£¬ÕâÊÇ Go ÓïÑÔÖÐ×îÇ¿µÄÐÔÄÜ·ÖÎöÆÊÎö¹¤¾ß£¬ÔÚÎÒ³ö°æµÄ ¡¶Go ÓïÑÔ±à³ÌÖ®Âá·ÌØÒâÓл¨Á¿Õ½ڵÄƪ·ù´óÃæ»ý½«½²½â¹ý¡£
ÔÚ Go ÓïÑÔÖУ¬PProf ÊÇÓÃÓÚ¿ÉÊÓ»¯ºÍ·ÖÎöÐÔÄÜ·ÖÎöÊý¾ÝµÄ¹¤¾ß£¬PProf ÒÔ profile.proto ¶ÁÈ¡·ÖÎöÑù±¾µÄ¼¯ºÏ£¬²¢Éú³É±¨¸æÒÔ¿ÉÊÓ»¯²¢°ïÖú·ÖÎöÊý¾Ý£¨Ö§³ÖÎı¾ºÍͼÐα¨¸æ£©¡£
ÎÒÃÇÖ±½ÓÓÃ go tool pprof
·ÖÎö Go ¹¤³ÌÖк¯ÊýÄÚ´æÉêÇëÇé¿ö£¬ÈçÏÂͼ£º
´ÓͼÀ´·ÖÎö£¬¿ÉÒÔ·¢ÏÖÊ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 ½øÐвɼ¯ºÍ²é¿´£º
Go ½ø³ÌµÄ¸÷ÏîÖ¸±êÕý³££¬ÍêºÃµÄ½â¾öÁËÕâ¸öÄÚ´æ鶵ÄÎÊÌâ¡£
ÔÚ½ñÌìÕâƪÎÄÕÂÖУ¬ÎÒÃǽéÉÜÁ˱ê×¼¿â time
µÄ»ù±¾³£¹æʹÓã¬Í¬Ê±Õë¶Ô Go С»ï°éËùÌá³öµÄ time.After
·½·¨µÄʹÓò»µ±£¬Ëùµ¼ÖµÄÄÚ´æй¶½øÐÐÁËÖØÏÖºÍÎÊÌâ½âÎö¡£
Æä¸ùÒò¾ÍÔÚÓÚ Go ÓïÑÔʱ¼ä¶ÑµÄ´¦Àí»úÖƺͳ£¹æ for
+select
+time.After
×éºÏµÄÏÂÒâʶд·¨Ëùµ¼ÖµÄй¶¡£
ͻȻÏëÆðÎÒÓÐÒ»¸öÅóÓÑÔÚ¹«Ë¾ÀïÓп´µ½¹ýÀàËƵĴúÂ룬ÔÚÉú²ú²È¹ýÕâ¸ö¿Ó£¬°ëÒ¹±»¸æ¾¯×¥ÆðÀ´...
²»ÖªµÀÄãÔÚÈÕ³£¹¤×÷ÖÐÓÐûÓÐÓöµ½¹ýÏàËƵÄÎÊÌâÄØ£¬»¶ÓÁôÑÔÇøÆÀÂۺͽ»Á÷¡£
ÎÄÕ³ÖÐø¸üУ¬¿ÉÒÔ΢ÐÅËÑ¡¾ÄÔ×Ó½ø¼åÓãÁË¡¿ÔĶÁ£¬»Ø¸´¡¾000¡¿ÓÐÎÒ×¼±¸µÄÒ»Ïß´ó³§ÃæÊÔËã·¨Ìâ½âºÍ×ÊÁÏ£»±¾ÎÄ GitHub github.com/eddycjy/blog ÒÑÊÕ¼£¬»¶Ó Star ´ß¸ü¡£
Sophie Hardach Clyde Quay Wharf 37 East Soapbox RxBalance EEHarbor Contrast...
¾³£ÄÜ¿´µ½ÓÐ¹Ø CSS »æͼµÄÎÄÕ£¬Æ©ÈçʹÓô¿ HTML + CSS »æÖÆÒ»·ù¶ßÀ² A ÃÎͼ»...
×òÍíÔÚ¿´Ò»µÀÃæÊÔÌ⣬·¢ÏÖÓÐÒ»²¿·ÖÈ˶ÔcssÑùʽµÄÓÅÏȼ¶²»ÊÇÌرðÇå³þ£¬¼Ó֮֮ǰ×Ô...
Html5ÌṩÁËÇ¿´óµÄ»æͼAPI£¬ÈÃÎÒÃÇÄܹ»Ê¹ÓÃjavascriptÇáËÉ»æÖƸ÷ÖÖͼÐΡ£±¾ÎĽ«...
Êý¾ÝÖÐ̨¿ªÆôÊý¾ÝÖÇÄÜÐÂʱ´ú ÔÚ´óÊý¾Ý¡¢È˹¤ÖÇÄܼ¼ÊõѸÃÍ·¢Õ¹ºÍÆóÒµÊý×Ö»¯×ªÐͼÓ...
Óöµ½µÄÎÊÌ⣺canvasÔªËرäÐÎʧÕæµÄÔÒò Ò»¸öDOMÔªËØ´æÔÚÈýÖֳߴ磺style³ß´ç£¬ht...
Ò»¡¢¹ØÓÚ Caffeine Cache ÔÚÍƼö·þÎñÖУ¬ËäÈ»ÔÊÐíÉÙÁ¿ÇëÇóÒò¼ÆË㳬ʱµÈÔÒò·µ»Ø...
ÔÚÕâƪÎÄÕ¿ªÆª£¬ÎÒÏȾÀÕýÒ»ÏÂÎÒ֮ǰдµÄһƪÈëÃÅÎÄÕµĴíÎ󣬻¹ÊÇÏÈÒýÓÃһϱÈ...
navigator.mediaDevices.getUserMedia Ó¦ÏîÄ¿ÒªÇó£¬ÐèҪʵÏÖÒƶ¯¶ËappǶÈëH5Ò³Ãæ...
×î½üÔÚreactÏîÄ¿Öгõ´ÎÓõ½ÁË html-webapck-plugin ²å¼þ£¬Óõ½¸Ã²å¼þµÄÁ½¸öÖ÷Òª...