温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用Ticker Or Sleep

发布时间:2021-10-21 16:26:12 来源:亿速云 阅读:147 作者:iii 栏目:编程语言

本篇内容介绍了“如何使用Ticker Or Sleep”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在写 Python 的时候,如果想让某个函数每 60 秒执行一次,我们一般这样写代码:

import time  while True:     some_function()     time.sleep(60)

如何使用Ticker Or Sleep

于是,我在写 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秒执行一次的定时函数。但是我们可以在外面控制这个协程,从而随时停止这个协程。

“如何使用Ticker Or Sleep”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI