Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: graceful shutdown, context, signal, waitgroup

Как реализовать graceful shutdown (defer, контекст, обработка ошибок в группах горутин)?

Вопрос охватывает методы корректного завершения работы приложения с сохранением состояния.

Короткий ответ

Для graceful shutdown используют:

  1. context.Context для отмены операций.

  2. sync.WaitGroup для ожидания завершения горутин.

  3. Обработку сигналов ОС (os.Interrupt).

Длинный ответ

Шаги реализации:

  1. Перехват сигналов:

    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()
    go func() {
        sig := make(chan os.Signal, 1)
        signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
        <-sig
        cancel() // Отмена контекста при сигнале
    }()
  2. Ожидание горутин:

    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        <-ctx.Done() // Ждём отмены
        // Завершаем работу
    }()
    wg.Wait()
  3. Освобождение ресурсов:

    defer db.Close() // Закрытие БД и т.п.

Пример:

package main

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

func worker(ctx context.Context, wg *sync.WaitGroup) {
	defer wg.Done()
	for {
		select {
		case <-ctx.Done():
			fmt.Println("Завершение работы")
			return
		default:
			time.Sleep(1 * time.Second)
		}
	}
}

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

	var wg sync.WaitGroup
	wg.Add(1)
	go worker(ctx, &wg)

	// Ожидание SIGINT (Ctrl+C)
	sig := make(chan os.Signal, 1)
	signal.Notify(sig, syscall.SIGINT)
	<-sig

	cancel() // Отмена контекста
	wg.Wait() // Ожидаем завершения
}

Вывод:
Graceful shutdown предотвращает потерю данных и корректно освобождает ресурсы.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    1

  • Сложность:

    8

Навыки

  • Golang

    Golang

Ключевые слова

#graceful shutdown

#context

#signal

#waitgroup

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.