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.