[Golang] timer可能造成的內存泄漏

背景
前兩天,跟一位學長交流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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章