GoDasturchi
Graceful Shutdown Basics

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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