Sobes.tech
Junior — Middle

Kā var pabeigt programmas izpildi, kad tiek saņemts pieprasījums apturēt tās darbu pašreizējā kontekstā?

sobes.tech AI

Atbilde no AI

Go valodā, lai pareizi pabeigtu programmu, ja ir pieprasījums to apturēt, parasti izmanto kontekstu (context.Context) ar atcelšanu. Tas ļauj nosūtīt atcelšanas signālu gorutinām un tās pareizi pabeigt.

Piemērs:

package main

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

func main() {
    ctx, cancel := context.WithCancel(context.Background())

    // Uzraudzīt sistēmas signālus apturēšanai
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Saņemts apturēšanas signāls")
        cancel() // nosūtīt atcelšanas signālu kontekstam
    }()

    // Sākt darbu, kas klausās kontekstu
    work(ctx)
}

func work(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Darbs pabeigts")
            return
        default:
            fmt.Println("Strādājam...")
            time.Sleep(1 * time.Second)
        }
    }
}

Ar šo pieeju, saņemot sistēmas signālu, programma pareizi pabeidz visus procesus un iziet.