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