Sobes.tech
Middle — Middle+

Kokia veiksmų seka yra reikalinga norint teisingai sustabdyti programą be duomenų praradimo ar gedimo?

sobes.tech AI

Atsakymas iš AI

Norint teisingai sustabdyti Go programą be duomenų praradimo ir klaidų, paprastai atliekami šie žingsniai:

  1. Operacinės sistemos signalų apdorojimas — gaunami užbaigimo signalai (SIGINT, SIGTERM) naudojant kanalą ir signal.Notify.

  2. Graceful shutdown pradžia — pradedama sklandaus uždarymo procedūra, kuri sustabdo naujų užklausų priėmimą ir leidžia esamoms užbaigti.

  3. Konteksto atšaukimas — naudojant context.Context su atšaukimu, perduodamas sustabdymo signalas visoms gorutinoms.

  4. Ištekliai uždaromi — uždaromos atidarytos jungtys su duomenų bazėmis, failais, tinklo jungtimis.

  5. Laukiama gorutinų užbaigimo — naudojant sync.WaitGroup ar kitus mechanizmus, laukiama, kol visi veiksmai bus baigti.

Pavyzdys signalo apdorojimo ir sklandaus uždarymo:

import (
    "context"
    "os"
    "os/signal"
    "sync"
    "syscall"
    "time"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    var wg sync.WaitGroup

    // Programos paleidimas
    wg.Add(1)
    go func() {
        defer wg.Done()
        runApp(ctx) // pagrindinė logika
    }()

    // Signalo apdorojimas
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    <-sigs // laukiama signalo
    cancel() // konteksto atšaukimas, signalizuoja gorutinoms

    // Laukiama užbaigimo
    done := make(chan struct{})
    go func() {
        wg.Wait()
        close(done)
    }()

    select {
    case <-done:
        // viskas baigta
    case <-time.After(10 * time.Second):
        // laiko limitas
    }
}

Šis požiūris padeda išvengti duomenų praradimo ir netinkamo uždarymo.