Sobes.tech
Junior — Middle

Учурдагы контекстте анын ишин токтотуу өтүнүчү келип түшкөндө, программаны кантип аяктоо керек?

sobes.tech AI

AIден жооп

Go тилинде, токтоону сурап жатканда программа туура бүтүшү үчүн, адатта, жокко чыгаруу менен контекст (context.Context) колдонулат. Бул goroutine'ларга жокко чыгаруу белгилерин жиберүүгө жана алардын туура бүтүшүнө мүмкүндүк берет.

Мисал:

package main

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

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

    // Жүйө сигналдарын көзөмөлдөө жана токтотуу
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Токтотуу сигналын алдык")
        cancel() // контекстке жокко чыгаруу сигналын жиберүү
    }()

    // ишти баштоо, ал контекстти угуп турат
    work(ctx)
}

func work(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Иш аяктады")
            return
        default:
            fmt.Println("Иштеп жатабыз...")
            time.Sleep(1 * time.Second)
        }
    }
}

Ошентип, системалык сигнал алынганда, программа бардык процесстерди туура аяктап чыгат.