Graceful Shutdown Basics
Muloyim to'xtash asoslari
Restoranni tasavvur qiling: yopilish vaqti keldi. Eshikni birdan yopib, hozir ovqatlanayotgan mijozlarni ham chiqarib yuborish — "qo'pol" to'xtash. Aksincha, "yangi mijoz qabul qilinmaydi" deb e'lon qilib, hozirgi mijozlar tugatishini kutib, keyin yopish — "muloyim" (graceful) to'xtash.
Dasturda ham xuddi shunday: dastur to'xtashi kerak bo'lganda (masalan deploy qilinganda, yoki server qayta ishga tushirilganda), hozir bajarilayotgan ishlarni birdan to'xtatish — ma'lumot yo'qolishiga yoki noto'liq holatga olib kelishi mumkin. Graceful Shutdown — "tugatish signali" kelganda hozirgi ishni yakunlab, keyin to'xtashni ta'minlaydi.
package main
import (
"context"
"fmt"
"time"
)
func worker(ctx context.Context, done chan<- string) {
select {
case <-time.After(50 * time.Millisecond):
done <- "ish tugadi"
case <-ctx.Done():
done <- "to'xtatildi: " + ctx.Err().Error()
}
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
defer cancel()
done := make(chan string)
go worker(ctx, done)
fmt.Println(<-done)
}context.WithTimeout — "Context Package" darsida ko'rgan tanish vosita, endi uni graceful shutdown'ning "soati" sifatida ishlatamiz: agar ctxga berilgan vaqt (10 millisekund) tugasa, ctx.Done() kanali yopiladi. Worker ichidagi select esa ikki narsadan qaysi biri birinchi bo'lishini kutadi: ishning o'zi tugashimi (time.After(50ms)), yoki to'xtash signali kelishimi (ctx.Done(), 10ms'da).
Bu misolda 10ms 50ms'dan tezroq bo'lgani uchun, "to'xtatish" g'olib chiqadi — worker o'z ishini tugatmasdan, lekin buni sezib, tartibli ravishda "to'xtatildim" deb xabar beradi. Bu — birdan os.Exit() chaqirib, hech narsani "aytmasdan" qulashdan tubdan farq qiladi.
>_ Exercise
Worker'ning tugash vaqtini o'zgartirib, u "g'olib chiqishini" ta'minlang.
- •context timeout'ni 100 millisekundga o'zgartiring
- •worker'ning time.After qiymatini 10 millisekundga o'zgartiring (ish tezroq tugaydi)
- •natijada "ish tugadi" xabari chiqishi kerak
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
select + context bilan "ish tugashi" va "to'xtash signali" orasida musobaqa tashkil qilish — graceful shutdown'ning asosiy qurilish bloki.
NEXT UP
Production Graceful Shutdown
$ go run main.go
Kodingizni ishga tushiring