最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang timer可能造成的內(nèi)存泄漏問題分析

 更新時(shí)間:2024年12月20日 17:07:38   作者:sai_j  
本文探討了Golang中timer可能造成的內(nèi)存泄漏問題,通過分析一段代碼,解釋了為什么協(xié)程在調(diào)用timer.Stop()后無法正常退出,文章指出,timer.Stop()并不關(guān)閉Channel,導(dǎo)致協(xié)程無法繼續(xù)執(zhí)行,最后,提出了一種修復(fù)方法,并呼吁大家關(guān)注和分享

Golang timer可能造成的內(nèi)存泄漏

背景

前兩天,跟一位學(xué)長(zhǎng)交流Golang;然后,他突然問我:你知道timer可能造成內(nèi)存泄漏嘛?

當(dāng)時(shí),甚是一臉懵逼,畢竟之前寫的Agent測(cè)了好久,都沒發(fā)現(xiàn)這個(gè)問題啊。

今天,就索性了解了下。

這里先說下結(jié)論:

  • timer的誤用可能造成某些等待timer的Goroutine無法正常退出,導(dǎo)致資源無法釋放;
  • (ps. 雖然的確算是內(nèi)存泄漏,但是對(duì)于我這種寫C出身的人來說,感覺還是怪怪的)

接下來進(jìn)入正題

讓我們先看一段代碼;

這段代碼的意圖是,協(xié)程在timer.Stop()調(diào)用后能夠繼續(xù)執(zhí)行從而退出;

但是,實(shí)際的效果呢? 我們沒有看到任何輸出提示;

那是為什么呢?

這當(dāng)中核心的原因就是,timer.Stop() 這個(gè)接口從設(shè)計(jì)的時(shí)候就設(shè)計(jì)成了并不去關(guān)閉Channel;

既然不關(guān)閉Chan,那么本例中的協(xié)程也就無法繼續(xù)執(zhí)行,從而退出了;

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)
}

作為一種修復(fù)手段:

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)
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Golang并發(fā)發(fā)送HTTP請(qǐng)求的各種方法

    Golang并發(fā)發(fā)送HTTP請(qǐng)求的各種方法

    在 Golang 領(lǐng)域,并發(fā)發(fā)送 HTTP 請(qǐng)求是優(yōu)化 Web 應(yīng)用程序的一項(xiàng)重要技能,本文探討了實(shí)現(xiàn)此目的的各種方法,從基本的 goroutine 到涉及通道和sync.WaitGroup 的高級(jí)技術(shù),需要的朋友可以參考下
    2024-02-02
  • Golang工具庫viper的使用教程

    Golang工具庫viper的使用教程

    viper?是?go?項(xiàng)目中用來讀取配置文件的庫,支持讀取?yaml、toml、json、hcl、env?等格式的配置文件,下面就來和大家聊聊它的具體使用吧
    2023-07-07
  • 一文帶你了解Go語言中的類型斷言和類型轉(zhuǎn)換

    一文帶你了解Go語言中的類型斷言和類型轉(zhuǎn)換

    在Go中,類型斷言和類型轉(zhuǎn)換是一個(gè)令人困惑的事情,他們似乎都在做同樣的事情。最明顯的不同點(diǎn)是他們具有不同的語法(variable.(type)?vs?type(variable)?)。本文我們就來深入研究一下二者的區(qū)別
    2022-09-09
  • go編程中g(shù)o-sql-driver的離奇bug解決記錄分析

    go編程中g(shù)o-sql-driver的離奇bug解決記錄分析

    這篇文章主要為大家介紹了go編程中g(shù)o-sql-driver的離奇bug解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Go中調(diào)用JS代碼(otto)的實(shí)現(xiàn)示例

    Go中調(diào)用JS代碼(otto)的實(shí)現(xiàn)示例

    Otto是一個(gè)用Go語言實(shí)現(xiàn)的JavaScript解釋器,可用于執(zhí)行和操作JavaScript代碼,適合在Go項(xiàng)目中執(zhí)行簡(jiǎn)單的JS腳本,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • Go語言如何實(shí)現(xiàn)TCP通信詳解

    Go語言如何實(shí)現(xiàn)TCP通信詳解

    go里面實(shí)現(xiàn)tcp沒有像之前寫的C++那些那么麻煩,在C++里面要先創(chuàng)建套接字,然后綁定ip地址,go里面直接就一個(gè)函數(shù)建立套接字,然后在進(jìn)行通信就可以了,下面這篇文章主要給大家介紹了關(guān)于Go語言如何實(shí)現(xiàn)TCP通信的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • golang如何使用gomobile進(jìn)行Android開發(fā)

    golang如何使用gomobile進(jìn)行Android開發(fā)

    golang可以開發(fā)android,使用golang開發(fā)android需要下載安裝gomobile,下面這篇文章主要給大家介紹了關(guān)于golang如何使用gomobile進(jìn)行Android開發(fā)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • golang架構(gòu)設(shè)計(jì)開閉原則手寫實(shí)現(xiàn)

    golang架構(gòu)設(shè)計(jì)開閉原則手寫實(shí)現(xiàn)

    這篇文章主要為大家介紹了golang架構(gòu)設(shè)計(jì)開閉原則手寫實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go語言之Goroutine與信道異常處理

    Go語言之Goroutine與信道異常處理

    這篇文章主要給大家介紹得是Go語言Goroutine與信道異常處理,Goroutine 之間通信是通過 channel 通信的,想詳細(xì)了解得小伙伴跟小編一起來學(xué)習(xí)下面文章內(nèi)容吧
    2021-10-10
  • golang內(nèi)置函數(shù)len的小技巧

    golang內(nèi)置函數(shù)len的小技巧

    len是很常用的內(nèi)置函數(shù),可以測(cè)量字符串、slice、array、channel以及map的長(zhǎng)度/元素個(gè)數(shù)。本文就來介紹一下其他小技巧,感興趣的可以了解一下
    2021-07-07

最新評(píng)論

永年县| 苗栗县| 乐安县| 四子王旗| 保定市| 天气| 高陵县| 金寨县| 昆山市| 大埔区| 温宿县| 丽水市| 清涧县| 青州市| 新田县| 于田县| 永春县| 东兴市| 红安县| 南澳县| 桐柏县| 舒兰市| 沧州市| 手游| 莫力| 枣庄市| 遵化市| 万源市| 图木舒克市| 来凤县| 鸡西市| 石屏县| 灵宝市| 偃师市| 沙河市| 平远县| 广平县| 鹤峰县| 临朐县| 习水县| 讷河市|