TGViewer
Библиотека Go-разработчика | Golang Библиотека Go-разработчика | Golang @goproglib · 24.1K subscribers
Post #7282 3.29K
🔌 Graceful Shutdown в Go: обработка сигналов

Первый шаг к нормальному завершению работы — научить сервер слышать сигналы от операционной системы. Без этого процесс падает молча, не успев ничего сделать.

📎 Добавляем обработку сигналов

Вместо того чтобы просто запустить http.ListenAndServe, запускаем его в горутине, а в основном потоке ждём сигнала:
package main

import (
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)

func handler(w http.ResponseWriter, r *http.Request) {
fmt.Println("handling request...")
time.Sleep(5 * time.Second)
fmt.Fprintln(w, "done")
}

func main() {
http.HandleFunc("/", handler)

go func() {
fmt.Println("server started at :8080")
http.ListenAndServe(":8080", nil)
}()

sig := make(chan os.Signal, 1)
signal.Notify(sig, os.Interrupt, syscall.SIGTERM)

<-sig
fmt.Println("shutdown signal received")
fmt.Println("exit")
}


Ключевые строки:
sig := make(chan os.Signal, 1)
signal.Notify(sig, os.Interrupt, syscall.SIGTERM)
<-sig


signal.Notify подписывает канал на SIGINT и SIGTERM. Когда ОС посылает один из этих сигналов, программа не падает немедленно, а получает уведомление и может выполнить финальный код.

📎 В чём всё ещё проблема

Сервер теперь знает, что его просят остановиться. Но он всё равно не ждёт текущие запросы. Если обработчик в середине работы, <-sig разблокируется и программа завершается, не дождавшись его.

Осведомлённость о сигнале — это не то же самое, что graceful shutdown. Это только первый слой.

Этот паттерн уже лучше наивного варианта. Сервис перестаёт падать просто так. Но для прода нужен следующий шаг — дать текущим запросам возможность завершиться.

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика

#GoToProduction
  • 🥱 7
  • 👍 6
  • 🌚 1
More from @goproglib
  1. Sep 28, 2026🤔 Вопрос с собеседования по Go Что выведет программа? ❤️ — 1 true / 0 false 🔥 — 1 true /…
  2. Sep 28, 2026👩‍💻 Что на самом деле происходит внутри Go map? После Go 1.24 обычный map внутри работае…
  3. Sep 26, 2026🔥 В Go 1.27 появился portable SIMD До этого SIMD-оптимизации в Go требовали архитектурног…
  4. Sep 25, 2026🤡🤡 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoGiggle
  5. Sep 25, 2026💡 Код работает. А data race уже есть В Go можно записать значение в одной горутине, прочи…
  6. Sep 23, 2026💥 TCP/IP: что происходит с данными в сети Когда Go-приложение отправляет данные по сети,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →