Golang如何正确的停止Ticker
Posted 程序猿武道馆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang如何正确的停止Ticker相关的知识,希望对你有一定的参考价值。
Golang可以利用time包的Ticker实现定时器的作用,最近使用Ticker时,发现调用Ticker的Stop方法无法正确的停止Ticker,协程会阻塞在等待Ticker的C通道处,精简后的代码如下:
函数中我们创建一个5s的定时器,然后启动协程,在协程中我们读取Ticker的C通道,当定时时间到达时,该通道就会读到数据。我们在主函数中调用
输出结果为:
Ticker1....
Ticker1....
Ticker1....
Ticker1....
并没有最后的Ticker1 Stop,查看Ticker的Stop方法的说明会发现:
// Stop turns off a ticker. After Stop, no more ticks will be sent.
// Stop does not close the channel, to prevent a read from the channel succeeding
// incorrectly.
翻一下就是Stop会停止Ticker,停止后,Ticker不会再被发送,但是Stop不会关闭通道,防止读取通道发生错误。
Golang中从已经关闭的通道读取数据会发生错误,Ticker的通道不关闭,防止我们在不必要的时候读取了已经关闭的通道。那么,到底如何科学的停止ticker呢?可以看看下面的函数
我们通过select读取两个通道,当stop通道读到true的时候,函数返回,由于使用了defer,会调用Ticker的Stop方法,之后从协程返回,主函数调用如下所示:
输出如下所示
Ticker2....
Ticker2....
Ticker2....
Ticker2....
Ticker2 Stop
可以看到,我们可以正常退出协程了。
苹果用户可长按赞赏
以上是关于Golang如何正确的停止Ticker的主要内容,如果未能解决你的问题,请参考以下文章
如何在 golang 中为我的测试用例正确创建模拟 http.request?
如何使用 Golang 正确发送 RPC 调用以获取智能合约所有者?