Sobes.tech
Middle

Go-da uşaq məlumat kontekstinin yaradılması hansı imkanları təqdim edir?

sobes.tech Süni İntellekt

AI-dan cavab

context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue istifadə edilərək yaradılan uşaq konteksti aşağıdakı imkanları təqdim edir:

  • İptal: Uşaq kontekstində başlatılmış əməliyyatları valideynə təsir etmədən ləğv etməyə imkan verir. Bu, kontekst yaradılarkən geri qaytarılan ləğv funksiyasını çağırmaqla həyata keçirilir.
  • Vaxt / Deadline: Əməliyyatların icra vaxtını məhdudlaşdırır. Əgər vaxt tamamlanmadan əvvəl əməliyyat bitərsə, kontekst avtomatik olaraq ləğv edilir.
  • Dəyərlərin ötürülməsi: Sorğu və ya əməliyyat üçün xüsusi dəyərləri aşağıdakı funksiya zəncirinə ötürməyə imkan verir (məsələn, sorğu identifikatoru, autentifikasiya məlumatları), funksiyaların imzalarını dəyişdirmədən.
  • Hierarxiya: Kontekstlərin hiyerarşik strukturunu yaradır. Valideyn kontekstin ləğvi avtomatik olaraq onun bütün uşaq kontekstlərini ləğv edir.
package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	// Valideyn kontekst, 3 saniyə sonra ləğv edilir
	parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancelParent() // Valideyn kontekstin ləğv ediləcəyinə əmin olun

	// Ləğv ilə uşaq kontekst yaradın
	childCtx, cancelChild := context.WithCancel(parentCtx)
	defer cancelChild() // Uşaq kontekstin ləğv ediləcəyinə əmin olun

	// Kontekstin ləğvini gözləyən funksiya
	go func(ctx context.Context) {
		select {
		case <-ctx.Done():
			// Bu blok kontekst ləğv olunduqda icra olunacaq
			fmt.Println("Uşaq goroutine ləğv olundu:", ctx.Err())
		}
	}(childCtx) // Uşaq kontekstini goroutine-ə ötür

	// Süni gecikmə, ləğvi nümayiş etdirmək üçün
	time.Sleep(5 * time.Second)

	fmt.Println("Proqram tamamlandı")
}

Bu nümunədə, valideyn kontekst 3 saniyəlik vaxt limiti ilə avtomatik olaraq uşaq kontekstini ləğv edəcək, bu da goroutine-in sonlanmasına səbəb olacaq. Uşaq kontekstini əl ilə cancelChild() çağırmaqla da ləğv etmək mümkündür, valideyn kontekstinin vaxt limiti keçməmişdən əvvəl.