问题代码
顺带说明下select 监听是如何工作的
1 | package main |
问题说明
以上代码会导致内存泄漏,其罪魁祸首是<-time.After()
,在官方文档中有此说明:如果定时器没有到达定时时间,gc
就不会启动垃圾回收。标准库文档中有说明:
The underlying Timer is not recovered by the garbage collector until the timer fires
解决方法
在不使用 time.After
来实现超时的前提下,可通过创建 timer
配合 reset
来实现超时机制,具体代码示例如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
....
go func(){
idleDuration := 2 * time.Second
idleDelay := time.NewTimer(idleDuration)
defer idleDelay.Stop()
for {
idleDelay.Reset(idleDuration)
select {
case num := <-ch:
fmt.Println("get num is", num)
case <-idleDelay.C:
fmt.Println("time's up!!!")
//done<-ture
}
}
}()
....
参考:
- studygolang.com/articles/22617