Golang如何正确的停止Ticker

Posted 程序猿武道馆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang如何正确的停止Ticker相关的知识,希望对你有一定的参考价值。

Golang可以利用time包的Ticker实现定时器的作用,最近使用Ticker时,发现调用Ticker的Stop方法无法正确的停止Ticker,协程会阻塞在等待Ticker的C通道处,精简后的代码如下:

函数中我们创建一个5s的定时器,然后启动协程,在协程中我们读取Ticker的C通道,当定时时间到达时,该通道就会读到数据。我们在主函数中调用

Golang如何正确的停止Ticker

输出结果为:

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呢?可以看看下面的函数

Golang如何正确的停止Ticker

我们通过select读取两个通道,当stop通道读到true的时候,函数返回,由于使用了defer,会调用Ticker的Stop方法,之后从协程返回,主函数调用如下所示:

Golang如何正确的停止Ticker

输出如下所示

Ticker2....
Ticker2....
Ticker2....
Ticker2....
Ticker2 Stop

可以看到,我们可以正常退出协程了。


苹果用户可长按赞赏

以上是关于Golang如何正确的停止Ticker的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Golang 中正确处理缓冲通道?

Golang 如何正确使用 Context

如何在 golang 中为我的测试用例正确创建模拟 http.request?

如何使用 Golang 正确发送 RPC 调用以获取智能合约所有者?

golang range for循环中如何正确的给goroutine传参

如何在Golang中实现正确的并行性? goroutines是否与Go1.5 +并行?