Ticker Or Sleep?定时执行的新选择
在写 Python 的时执时候,如果想让某个函数每 60 秒执行一次,行的新选我们一般这样写代码:
import time while True: some_function() time.sleep(60)
于是时执,我在写 Golang 代码的行的新选时候,也使用了这种方式:
package main import ( "fmt" "time" ) func someFunction() { fmt.Println("我是时执某个函数") } func main() { for { someFunction() time.Sleep(10 * time.Second) } }今天在看同事的代码时,发现他是行的新选这样写的:
package main import ( "fmt" "time" ) func someFunction() { fmt.Println("我是某个函数") } func main() { tikcer := time.NewTicker(10 * time.Second) for { <-tikcer.C someFunction() } }这种写法,初看起来时跟time.Sleep没什么区别,时执但是行的新选仔细一想,却发现它有很多优势。时执
首先,行的新选NewTicker会在背后计时,时执时间到了以后,行的新选会向内部的企商汇时执一个 channel 中推入当前的时间。然后继续计时。行的新选所以,时执如果函数someFunction()执行了3秒钟。那么接下来过7秒就会继续执行。但如果使用time.Sleep,函数执行完成以后,还要再等10秒钟才会执行。
其次,如果不启动新的协程,那么当执行到time.Sleep时,整个程序是卡住的,必须等待它结束了才能执行后面的操作。但如果使用 NewTicker,那么在等待的时间,还可以做很多其他的事情。多个不同的定时器可以同时工作:
package main import ( "fmt" "time" ) func someFunction() { fmt.Println("我是某个函数") } func anotherFunction() { fmt.Println("另一个函数") } func thirdFunction() { fmt.Println("第三个函数") } func main() { tikcer1 := time.NewTicker(10 * time.Second) tikcer2 := time.NewTicker(5 * time.Second) tikcer3 := time.NewTicker(3 * time.Second) for { select { case <-tikcer1.C: someFunction() case <-tikcer2.C: anotherFunction() case <-tikcer3.C: thirdFunction() } } }这样可以实现,亿华云每3秒执行 thirdFunction函数,每5秒执行anotherFunction,每10秒执行一次someFunction。大家可以考虑一下,如何用 time.Sleep来实现这样的功能。
注意每个函数都是独立计时的,只要他们执行的时间不超过他们间隔的时间,就不会互相影响。
除了全部用来计时外,我们还可以用来设置外部开关,中断一个协程。例如:
package main import ( "fmt" "time" ) func doSomething() { fmt.Println("进行某些操作") } func someFunction(stop chan bool) { fmt.Println("我是某个函数") tikcer1 := time.NewTicker(10 * time.Second) for { select { case <-tikcer1.C: doSomething() case <-stop: return } } } func main() { stop := make(chan bool) go someFunction(stop) //很多行代码 //很多行代码 //很多行代码 stop <- true //其他代码 //其他代码 }在协程里面是一个10秒执行一次的定时函数。但是我们可以在外面控制这个协程,从而随时停止这个协程。
本文转载自微信公众号「未闻Code」,可以通过以下二维码关注。转载本文请联系未闻Code公众号。

相关文章
- 摘要:随着电脑在我们生活中的日益普及和重要性的增加,人们对电脑的个性化需求也越来越高。在这篇文章中,我们将为大家介绍一种制作个性化电脑印章的方法——使用激光印章。激光印章不仅可以满足个性...2025-11-05
注意这几点,轻轻松松配置 Nginx + Tomcat 的集群和负载均衡
复制http{ ... #gzipon; #设置负载均衡的服务器列表和权重 upstreamtomcat-ha{2025-11-05Tomcat 中的 Session 和 Cookie的爱恨情仇
复制//设置Cookie HTTP/1.1200OK Server:Apache-Coyote/1.1 Set-Cookie:JSES2025-11-05- 复制./configure 1.2025-11-05
- 摘要:随着电脑在我们生活中的日益普及和重要性的增加,人们对电脑的个性化需求也越来越高。在这篇文章中,我们将为大家介绍一种制作个性化电脑印章的方法——使用激光印章。激光印章不仅可以满足个性...2025-11-05

ElasticSearch 如何使用 TDigest 算法计算亿级数据的百分位数?
[[393929]]本文转载自微信公众号「程序员历小冰」,作者历小冰。转载本文请联系程序员历小冰公众号。大家好,我是历小冰。ElasticSearch 作为一个分布式的开源搜索和分析引擎,不仅能够进行2025-11-05

最新评论