Junior — Middle
Kaip galima užbaigti programos vykdymą, kai esame dabartiniame kontekste, kai yra prašymas sustabdyti jos darbą?
sobes.tech AI
Atsakymas iš AI
Go kalboje, norint teisingai užbaigti programą, kai yra prašymas ją sustabdyti, dažnai naudojamas kontekstas (context.Context) su atšaukimu. Tai leidžia siųsti atšaukimo signalą gorutinoms ir jas teisingai užbaigti.
Pavyzdys:
package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
// Stebėti sisteminius signalus sustabdymui
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
fmt.Println("Gavome sustabdymo signalą")
cancel() // siųsti atšaukimo signalą kontekstui
}()
// Pradėti darbą, kuris klausosi konteksto
work(ctx)
}
func work(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Darbas baigtas")
return
default:
fmt.Println("Dirbame...")
time.Sleep(1 * time.Second)
}
}
}
Šiuo būdu, kai gaunamas sistemos signalas, programa teisingai užbaigia visus procesus ir išeina.