Go Academy · Oppitunti

Vuotojen tunnistus ja peruutukset

Goroutinejen päättymisen varmistaminen ja vuotojen estäminen

Oppitunti 4/413 vaihetta

Vuotojen tunnistus ja peruutukset on ilmainen Go Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Go Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Go Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on goroutiinin vuoto?

Goroutiinin vuoto syntyy, kun goroutiini käynnistyy mutta ei koskaan pääty. Vuotavat goroutiinit kasaantuvat ajan mittaan ja kuluttavat pino-muistia sekä suoritinaikaa, kunnes prosessi lopetetaan.

Yleinen vuoto: kanavan vastaanotto estyy

Kanavan vastaanottoa odottava goroutiini, joka ei koskaan saa arvoa, estyy pysyvästi:

go func() {
    v := <-ch // leaks if no sender and ch is never closed
    use(v)
}()

Yleinen vuoto: done-signaali puuttuu

for-silmukassa oleva goroutiini, jolla ei ole lopetusehtoa tai done-kanavaa, suoritetaan loputtomasti:

go func() {
    for {
        work()
        // no exit condition — leaks
    }
}()

Vuotojen havaitseminen goleakilla

go.uber.org/goleak varmistaa, ettei testin lopussa ole vuotaneita goroutiineja:

func TestMyFunc(t *testing.T) {
    defer goleak.VerifyNone(t)
    myFunc() // should not leak goroutines
}

Context ratkaisuna

Idioomaattinen tapa pysäyttää pitkään suoritettavat goroutinit on context. Välitä ctx goroutiinille ja valitse ctx.Done()-kanava.

go func(ctx context.Context) {
    for {
        select {
        case work := <-workCh:
            process(work)
        case <-ctx.Done():
            return // clean exit
        }
    }
}(ctx)

Done-kanavamalli

Yksinkertaisemmissa tapauksissa, joissa contextia ei käytetä, käytä erillistä done-kanavaa. Sulje se, jotta voit lähettää pysäytyssignaalin kaikille sitä lukeville goroutiineille.

done := make(chan struct{})
go func() {
    select {
    case v := <-data: use(v)
    case <-done: return
    }
}()
close(done) // stops goroutine

Havaitseminen runtimen avulla

Tulosta goroutiinien määrä havaitaksesi määrän kasvun ajonaikaisesti:

fmt.Println("goroutines:", runtime.NumGoroutine())

HTTP-palvelimen goroutinit

net/http hallitsee pyyntökohtaisia goroutiineja automaattisesti ja siivoaa ne, kun pyyntö päättyy. Käsittelijät, jotka käynnistävät goroutiineja ilman siivousta, voivat silti aiheuttaa vuotoja.

Vuotojen testaaminen

Suorita testipakettisi goleakilla joko TestMain-funktiona tai testikohtaisella defer-lauseella. Mikä tahansa testirungon jälkeen päättymättä jäänyt goroutiini aiheuttaa testin epäonnistumisen.

func TestMain(m *testing.M) {
    goleak.VerifyTestMain(m)
}

time.After-vuodot

time.After-kutsun käyttäminen silmukan sisäisessä select-lauseessa luo jokaisella kierroksella uuden ajastimen, jota ei voida kerätä roskienkeruulla ennen kuin ajastin laukeaa. Korvaa se yhdistelmällä time.NewTimer ja Reset.

Goroutiinin aiheuttama vuoto virheen palautuessa

Jos goroutiinin on tarkoitus lähettää tulos kanavalle mutta se palaa virheen vuoksi lähettämättä tulosta, kuluttajagoroutiini estyy pysyvästi. Lähetä aina arvo tai sulje kanava kaikissa suorituspoluissa.

Pikatarkistus

Mikä on idiomaattisin tapa pysäyttää pitkään suoritettava goroutiini Go-ohjelmassa?

Kertaus: vuotojen havaitseminen ja peruutus

Keskeiset kohdat:

  • Goroutiinin vuodot kasaantuvat; seuraa niitä runtime.NumGoroutine()-funktion avulla
  • Testien goleak havaitsee goroutiinivuodot automaattisesti
  • Anna goroutiineille aina poistumisreitti: context, done-kanava tai suljettu syöte
  • time.After aiheuttaa silmukoissa ajastinvuotoja; käytä yhdistelmää NewTimer+Reset
Aloita maksutta

Opi Go tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Vuotojen tunnistus ja peruutukset” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Go Academy-oppimispolun 3 oppituntia, myös oppitunnin “Vuotojen tunnistus ja peruutukset”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Go Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Vuotojen tunnistus ja peruutukset”?

Goroutinejen päättymisen varmistaminen ja vuotojen estäminen Harjoittelet Go Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Go Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Go Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Vuotojen tunnistus ja peruutukset”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Go Academy-oppitunnilla?

Kyllä. Jokainen Go Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Pipeline- ja stage-mallit
  2. errgroup samanaikaiseen virheenkäsittelyyn
  3. Semaforimalli
  4. Vuotojen tunnistus ja peruutukset
← Takaisin: Go Academy