Sobes.tech
Middle

Aké možnosti poskytuje vytvorenie podriadeného kontextu údajov v Go?

sobes.tech AI

Odpoveď od AI

Vytvorenie podkontekstu (pomocou context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) poskytuje nasledujúce možnosti:

  • Zrušenie: Umožňuje zrušiť operácie spustené v podkontekste bez ovplyvnenia rodičovského kontextu. Toho sa dosiahne volaním funkcie zrušenia, ktorá sa vráti pri vytvorení kontextu.
  • Časový limit / Deadline: Obmedzuje čas vykonávania operácií. Ak čas vyprší skôr, ako operácia skončí, kontext sa automaticky zruší.
  • Prenos hodnôt: Umožňuje prenášať špecifické hodnoty požiadavky alebo operácie nadol v reťazci volaní (napríklad ID požiadavky, údaje o autentifikácii), bez zmeny podpisov funkcií.
  • Hierarchia: Vytvára hierarchickú štruktúru kontextov. Zrušenie rodičovského kontextu automaticky zruší všetky jeho podkonteksty.
package main

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

func main() {
	// Rodičovský kontext, ktorý bude zrušený po 3 sekundách
	parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancelParent() // Uistite sa, že rodičovský kontext bude zrušený

	// Vytvorenie podkontekstu so zrušením
	childCtx, cancelChild := context.WithCancel(parentCtx)
	defer cancelChild() // Uistite sa, že podkontekst bude zrušený

	// Funkcia, ktorá čaká na zrušenie kontextu
	go func(ctx context.Context) {
		select {
		case <-ctx.Done():
			// Tento blok sa vykoná, keď bude kontext zrušený
			fmt.Println("Podkontekst zrušený:", ctx.Err())
		}
	}(childCtx) // Odovzdanie podkontekstu do gorutiny

	// Umelé oneskorenie na demonštráciu zrušenia
	time.Sleep(5 * time.Second)

	fmt.Println("Program ukončený")
}

V tomto príklade rodičovský kontext s časovým limitom 3 sekundy automaticky zruší podkontekst, čo povedie k ukončeniu gorutiny. Podkontekst je možné tiež manuálne zrušiť volaním cancelChild(), skôr než vyprší časový limit rodičovského kontextu.