Back to questions
Middle+
4
Что такое graceful shutdown и как он работает в Go?
Companies where asked
Веро Трейс
Answer from AI
sobes.tech AI
Graceful shutdown — это корректное завершение работы приложения, при котором оно успевает завершить текущие операции, освободить ресурсы и корректно закрыть соединения, прежде чем полностью остановиться.
В Go graceful shutdown обычно реализуется с помощью обработки системных сигналов (например, SIGINT, SIGTERM). При получении сигнала приложение начинает процесс завершения:
- Останавливает приём новых запросов.
- Завершает обработку текущих запросов или задач.
- Освобождает ресурсы (базы данных, файлы, соединения).
- Завершает работу и выходит.
Пример реализации graceful shutdown в Go:
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
srv := &http.Server{Addr: ":8080"}
// Запускаем сервер в отдельной горутине
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("ListenAndServe(): %v", err)
}
}()
// Создаем канал для получения сигналов
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit // ждем сигнала
log.Println("Shutting down server...")
// Создаем контекст с таймаутом для завершения работы
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatalf("Server forced to shutdown: %v", err)
}
log.Println("Server exiting")
}
Таким образом, приложение корректно завершает работу, не прерывая активные соединения и операции.