在写Python的时候,如果我们想要一个函数每60秒执行一次,我们通常会这样写代码:importtimewhileTrue:some_function()time.sleep(60)所以,我在写Golang代码这个方法也用在:packagemainimport("fmt""time")funcsomeFunction(){fmt.Println("我是某个函数")}funcmain(){for{someFunction()time.Sleep(10*time.第二)}}今天看同事的代码时,发现他写了:tikcer:=time.NewTicker(10*time.Second)for{<-tikcer.CsomeFunction()}}这种写法和time.Sleep没什么两样,乍看之下,但是仔细一想,你会发现它有很多优点。首先,NewTicker会在后台统计时间,当时间到了,它会将当前时间推入一个内部通道。然后保持计时。所以,如果函数someFunction()执行了3秒。然后在接下来的7秒内继续执行。但是如果使用time.Sleep,函数执行完后,还要等10秒才会执行。其次,如果不启动新的协程,那么当time.Sleep执行时,整个程序就会卡住,必须等它结束才能进行后续操作。但是如果你使用NewTicker,你可以在等待的时候做很多其他的事情。多个不同的定时器可以同时工作:packagemainimport("fmt""time")funcsomeFunction(){fmt.Println("Iamafunction")}funcanotherFunction(){fmt.Println("Anotherfunction")}functirdFunction(){fmt.Println("第三个函数")}funcmain(){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()}}}这样可以实现,执行thirdFunction每3秒执行一次函数,每5秒执行一次anotherFunction,每10秒执行一次someFunction。大家可以想想怎么用time.Sleep来实现这样的功能。注意每个函数都是独立定时的,只要它们的执行时间不超过它们之间的时间,就不会互相影响。除了用于计时,我们还可以用它来设置外部开关和中断一个协程。例如:packagemainimport("fmt""time")funcdoSomething(){fmt.Println("dosomething")}funcsomeFunction(stopchanbool){fmt.Println("我是某个函数")tikcer1:=time.NewTicker(10*time.Second)for{select{case<-tikcer1.C:doSomething()case<-stop:return}}}funcmain(){stop:=make(chanbool)gosomeFunction(stop)//多行代码//大量代码行//大量代码行停止<-true//其他代码//其他代码}在协程中,是一个定时函数,每10秒执行一次。但是我们可以从外部控制这个协程,随时停止这个协程。本文转载自微信公众号“闻所未闻的密码”,可通过以下二维码关注。转载本文请联系Code公众号。
