GoDasturchi
Context Package: Cancellation and Timeouts

Context Package: Cancellation and Timeouts

Context paketi: bekor qilish va vaqt chegarasi

Uzoq davom etadigan ishni (masalan, katta hisob-kitob yoki tarmoq so'rovi) qanday qilib "to'xtat" deb aytish mumkin? context paketi shu uchun standart yechim beradi: context.Context — bekor qilish signalini butun chaqiruvlar zanjiri bo'ylab uzatadigan qiymat.

example.go
ctx, cancel := context.WithCancel(context.Background())
// ... ctx ni ishlarga uzating ...
cancel()  // signal beradi: "to'xtash vaqti keldi"

select {
case <-ctx.Done():
    // signal keldi
default:
    // hali signal yo'q
}

ctx.Done() — yopiladigan (lekin hech qachon qiymat yubormaydigan) kanal qaytaradi. Kanal yopilishi — Channels darsida ko'rganingizdek — darhol "tayyor" holatga o'tadi, shuning uchun <-ctx.Done() cancel() chaqirilgan zahoti signal beradi. Bu — Select Statement darsidagi bloklanmasdan tekshirish naqshi bilan tabiiy birlashadi.

>_ Exercise

CountUntilCancel(ctx context.Context, limit int) int funksiyasini yozing. limit martagacha tsikl aylanib, har bir aylanishda select bilan ctx.Done()ni tekshiring: agar signal kelgan bo'lsa, hozirgacha to'plangan hisoblagichni qaytaring; aks holda (default) hisoblagichni bittaga oshirib davom eting. Agar tsikl limitgacha to'liq yetib borsa, limitning o'zini qaytaring.

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

context.Context uzun davom etadigan ishga bekor qilish signalini uzatishning standart usuli. ctx.Done() kanali cancel() chaqirilganda yopiladi; selectdagi default bilan birgalikda bu — davom etayotgan ishni bloklanmasdan har bir qadamda "bekor qilinganmi?" deb tekshirish imkonini beradi.

NEXT UP

Race Detection and Data Races

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Context Package: Cancellation and Timeouts

Context paketi: bekor qilish va vaqt chegarasi

Uzoq davom etadigan ishni (masalan, katta hisob-kitob yoki tarmoq so'rovi) qanday qilib "to'xtat" deb aytish mumkin? context paketi shu uchun standart yechim beradi: context.Context — bekor qilish signalini butun chaqiruvlar zanjiri bo'ylab uzatadigan qiymat.

example.go
ctx, cancel := context.WithCancel(context.Background())
// ... ctx ni ishlarga uzating ...
cancel()  // signal beradi: "to'xtash vaqti keldi"

select {
case <-ctx.Done():
    // signal keldi
default:
    // hali signal yo'q
}

ctx.Done() — yopiladigan (lekin hech qachon qiymat yubormaydigan) kanal qaytaradi. Kanal yopilishi — Channels darsida ko'rganingizdek — darhol "tayyor" holatga o'tadi, shuning uchun <-ctx.Done() cancel() chaqirilgan zahoti signal beradi. Bu — Select Statement darsidagi bloklanmasdan tekshirish naqshi bilan tabiiy birlashadi.

>_ Exercise

CountUntilCancel(ctx context.Context, limit int) int funksiyasini yozing. limit martagacha tsikl aylanib, har bir aylanishda select bilan ctx.Done()ni tekshiring: agar signal kelgan bo'lsa, hozirgacha to'plangan hisoblagichni qaytaring; aks holda (default) hisoblagichni bittaga oshirib davom eting. Agar tsikl limitgacha to'liq yetib borsa, limitning o'zini qaytaring.

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

context.Context uzun davom etadigan ishga bekor qilish signalini uzatishning standart usuli. ctx.Done() kanali cancel() chaqirilganda yopiladi; selectdagi default bilan birgalikda bu — davom etayotgan ishni bloklanmasdan har bir qadamda "bekor qilinganmi?" deb tekshirish imkonini beradi.

NEXT UP

Race Detection and Data Races