文章目录
  1. 1. 优雅的关闭ticker

tickergoroutine组合使用中当调用ticker.Stop()关闭ticker之后,相应的goroutine中的ticker.C并没有停掉,下面总结一种优雅的方式关闭ticker.

优雅的关闭ticker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package main
import (
"fmt"
"time"
)

func main() {
Demo()
}

func Demo() {
done := startTicker(PrintInfo)
time.Sleep(time.Duration(12) * time.Second)
close(done)
time.Sleep(time.Duration(1) * time.Minute)
fmt.Println("main finished")
}

func startTicker(f func()) chan struct{} {
done := make(chan struct{}, 1)
go func() {
ticker := time.NewTicker(5 * time.Second)
// ticker := time.NewTicker(5 * time.Minute)
defer ticker.Stop()

for {
select {
case <-ticker.C:
f()
case <-done:
return
}
}
}()
return done
}

func PrintInfo() {
fmt.Println("hello")
}

上述代码通过startTicker创建一个ticker, 当想要关闭这个ticker并同时退出对应goroutine中的for时,可以直接close(),发送done信号直接返回退出startTicker即可.

作者署名:朴实的一线攻城狮
本文标题:优雅的关闭ticker
本文出处:http://researchlab.github.io/2016/10/16/close-ticker-correctly/
版权声明:本文由Lee Hong创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处, 否则保留追究法律责任的权利。

@一线攻城狮

关注微信公众号 @一线攻城狮

总访问:
总访客: