Middle
Go'da bolalar ma'lumotlar kontekstini yaratish qanday imkoniyatlar beradi?
sobes.tech AI
AIdan javob
context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue yordamida yaratilgan bolalar konteksti quyidagi imkoniyatlarni taqdim etadi:
- Bekor qilish: Bolalar kontekstida boshlagan operatsiyalarni ota kontekstga ta'sir qilmasdan bekor qilish imkonini beradi. Bu, kontekstni yaratishda qaytarilgan bekor qilish funksiyasini chaqirish orqali amalga oshiriladi.
- Vaqt / Deadline: Operatsiyalarni bajarish vaqtini cheklaydi. Agar vaqt tugashidan oldin operatsiya yakunlanmasa, kontekst avtomatik ravishda bekor qilinadi.
- Qiymatlarni uzatish: So'rov yoki operatsiya uchun maxsus qiymatlarni pastga, funksiyalar zanjiriga uzatishga imkon beradi (masalan, so'rov identifikatori, autentifikatsiya ma'lumotlari), funksiyalar imzolarini o'zgartirmasdan.
- Hierarxiya: Kontekstlarning hierarxik tuzilmasini yaratadi. Ota kontekstning bekor qilinishi avtomatik ravishda uning barcha bolalar kontekstlarini bekor qiladi.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Ota kontekst, 3 soniya ichida bekor qilinadi
parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelParent() // Ota kontekst bekor qilinishini ta'minlash
// Bekor qilish bilan bolalar kontekstini yaratish
childCtx, cancelChild := context.WithCancel(parentCtx)
defer cancelChild() // Bolalar kontekstini bekor qilishni ta'minlash
// Kontekstning bekor qilinishini kutadigan funksiya
go func(ctx context.Context) {
select {
case <-ctx.Done():
// Bu blok kontekst bekor qilinganda bajariladi
fmt.Println("Bolalar goroutine bekor qilindi:", ctx.Err())
}
}(childCtx) // Bolalar kontekstini goroutine'ga uzatish
// Sun'iy kechikish, bekor qilishni ko'rsatish uchun
time.Sleep(5 * time.Second)
fmt.Println("Dastur yakunlandi")
}
Ushbu misolda, 3 soniyali timeout bilan ota kontekst avtomatik ravishda bolalar kontekstini bekor qiladi, bu esa goroutine'ning yakunlanishiga olib keladi. Bolalar kontekstini qo'lda cancelChild() chaqirish orqali ham bekor qilish mumkin, ota kontekstining timeoutidan oldin.