背景
前兩天,跟一位學長交流Golang;然後,他突然問我:你知道timer可能造成內存泄漏嘛? 當時,甚是一臉懵逼,畢竟之前寫的Agent測了好久,都沒發現這個問題啊。今天,就索性瞭解了下。這裏先說下結論,timer的誤用可能造成某些等待timer的Goroutine無法正常退出,導致資源無法釋放;(ps. 雖然的確算是內存泄漏,但是對於我這種寫C出身的人來說,感覺還是怪怪的)
接下來進入正題,讓我們先看一段代碼;
這段代碼的意圖是,協程在timer.Stop()調用後能夠繼續執行從而退出;
但是,實際的效果呢? 我們沒有看到任何輸出提示;
那是爲什麼呢?這當中核心的原因就是,timer.Stop() 這個接口從設計的時候就設計成了並不去關閉Channel;既然不關閉Chan,那麼本例中的協程也就無法繼續執行,從而退出了;
package main
import (
"time"
"fmt"
)
func main() {
timer := time.NewTimer(3 * time.Second)
go func() {
<-timer.C
fmt.Println("Timer has expired.")
}()
timer.Stop()
time.Sleep(60 * time.Second)
}
作爲一種修復手段,
package main
import (
"time"
"fmt"
)
func main() {
timer := time.NewTimer(3 * time.Second)
go func() {
<-timer.C
fmt.Println("Timer has expired.")
}()
//timer.Stop()
timer.Reset(0 * time.Second)
time.Sleep(60 * time.Second)
}
————————————————
版權聲明:本文爲CSDN博主「sai_j」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sai_j/article/details/82780081