Middle
Koje mogućnosti pruža kreiranje podređenog konteksta podataka u Go?
sobes.tech АИ
Одговор од АИ
Kreiranje podkonteksta (pomoću context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) pruža sledeće mogućnosti:
- Otkaži: Omogućava otkazivanje operacija pokrenutih u podkontekstu, bez uticaja na roditeljski kontekst. To se postiže pozivanjem funkcije za otkazivanje koja se vraća prilikom kreiranja konteksta.
- Vremensko ograničenje / Deadline: Ograničava vreme izvršavanja operacija. Ako vreme istekne pre završetka operacije, kontekst se automatski otkazuje.
- Prenos vrednosti: Omogućava prenos specifičnih vrednosti za zahtev ili operaciju naniže u lancu poziva (npr. ID zahteva, podaci za autentifikaciju), bez menjanja potpisa funkcija.
- Hijerarhija: Kreira hijerarhsku strukturu kontekata. Otkazivanje roditeljskog konteksta automatski otkazuje sve njegove podkontekste.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Roditeljski kontekst, koji će biti otkazan nakon 3 sekunde
parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelParent() // Uverite se da će roditeljski kontekst biti otkazan
// Kreiranje podkonteksta sa otkazivanjem
childCtx, cancelChild := context.WithCancel(parentCtx)
defer cancelChild() // Uverite se da će podkontekst biti otkazan
// Funkcija koja čeka otkazivanje konteksta
go func(ctx context.Context) {
select {
case <-ctx.Done():
// Ovaj blok će se izvršiti kada se kontekst otkaže
fmt.Println("Podkontekst otkazan:", ctx.Err())
}
}(childCtx) // Prosleđivanje podkonteksta u gorutinu
// Veštačko kašnjenje za demonstraciju otkazivanja
time.Sleep(5 * time.Second)
fmt.Println("Program je završio")
}
U ovom primeru, roditeljski kontekst sa timeout-om od 3 sekunde automatski će otkazati podkontekst, što će dovesti do završetka gorutine. Podkontekst se takođe može ručno otkazati pozivom cancelChild(), pre isteka timeout-a roditeljskog konteksta.