Sobes.tech
Назад к вопросам
Junior — Middle
78

Каким образом можно завершить выполнение программы, когда происходит запрос на остановку её работы в текущем контексте?

Ответ от нейросети

sobes.tech AI

В Go для корректного завершения программы при запросе на остановку обычно используют контекст (context.Context) с отменой. Это позволяет передавать сигнал отмены в горутины и корректно завершать их работу.

Пример:

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)
        }
    }
}

Таким образом, при получении сигнала ОС программа корректно завершает все процессы и выходит.