Sobes.tech
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.