亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

背景

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

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

今天,就索性了解了下。

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

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

接下來(lái)進(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é)程也就無(wú)法繼續(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)文章

  • Go微服務(wù)項(xiàng)目配置文件的定義和讀取示例詳解

    Go微服務(wù)項(xiàng)目配置文件的定義和讀取示例詳解

    這篇文章主要為大家介紹了Go微服務(wù)項(xiàng)目配置文件的定義和讀取示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語(yǔ)言封裝MinIO相關(guān)操作詳解

    Go語(yǔ)言封裝MinIO相關(guān)操作詳解

    MinIO?是一個(gè)高性能的對(duì)象存儲(chǔ)服務(wù),兼容?Amazon?S3?API,廣泛用于存儲(chǔ)和管理海量數(shù)據(jù),本文將介紹如何用?Go?語(yǔ)言封裝一個(gè)簡(jiǎn)單的?MinIO?操作包,需要的可以參考下
    2024-11-11
  • golang實(shí)現(xiàn)命令行程序的使用幫助功能

    golang實(shí)現(xiàn)命令行程序的使用幫助功能

    這篇文章介紹了golang實(shí)現(xiàn)命令行程序使用幫助的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Go語(yǔ)言實(shí)現(xiàn)ssh&scp的方法詳解

    Go語(yǔ)言實(shí)現(xiàn)ssh&scp的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Go語(yǔ)言實(shí)現(xiàn)ssh&scp,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下
    2022-10-10
  • Go語(yǔ)言新寵:pdqsort排序算法的完美打造

    Go語(yǔ)言新寵:pdqsort排序算法的完美打造

    pdqsort是一種新的排序算法,特別適用于Go語(yǔ)言,它是由Go語(yǔ)言團(tuán)隊(duì)開發(fā)的,旨在提供高效且穩(wěn)定的排序算法,pdqsort采用了一種分治的策略,將數(shù)組分成小塊進(jìn)行排序,然后再合并這些塊,需要的朋友可以參考下
    2023-10-10
  • Golang 模塊引入及表格讀寫業(yè)務(wù)快速實(shí)現(xiàn)示例

    Golang 模塊引入及表格讀寫業(yè)務(wù)快速實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Golang模塊引入及表格讀寫業(yè)務(wù)的快速實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go并發(fā)編程中sync/errGroup的使用

    Go并發(fā)編程中sync/errGroup的使用

    本文主要介紹了Go并發(fā)編程中sync/errGroup的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • CMD下執(zhí)行Go出現(xiàn)中文亂碼的解決方法

    CMD下執(zhí)行Go出現(xiàn)中文亂碼的解決方法

    需要在Go寫的服務(wù)里面調(diào)用命令行或者批處理,并根據(jù)返回的結(jié)果做處理。但是windows下面用cmd返回中文會(huì)出現(xiàn)亂碼,本文就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下
    2021-12-12
  • 源碼剖析Golang如何fork一個(gè)進(jìn)程

    源碼剖析Golang如何fork一個(gè)進(jìn)程

    創(chuàng)建一個(gè)新進(jìn)程分為兩個(gè)步驟,一個(gè)是fork系統(tǒng)調(diào)用,一個(gè)是execve?系統(tǒng)調(diào)用,本文將從源碼的角度帶大家剖析一下Golang是如何fork一個(gè)進(jìn)程的
    2023-06-06
  • omitempty在go中的使用方式

    omitempty在go中的使用方式

    在Go語(yǔ)言編程中,`omitempty`標(biāo)記用于JSON編解碼過(guò)程中控制字段是否被包含,當(dāng)結(jié)構(gòu)體字段標(biāo)記為`omitempty`且字段值為空時(shí),該字段不會(huì)出現(xiàn)在生成的JSON中,有助于優(yōu)化JSON結(jié)構(gòu)和減小數(shù)據(jù)體積,通過(guò)具體示例解釋了`omitempty`的工作機(jī)制和實(shí)際效果
    2024-09-09

最新評(píng)論