Sobes.tech
Middle

Jaké možnosti nabízí vytvoření podřízeného kontextu dat v Go?

sobes.tech AI

Odpověď od AI

Vytvoření podřízeného kontextu (pomocí context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) poskytuje následující možnosti:

  • Zrušení: Umožňuje zrušit operace spuštěné v podřízeném kontextu, aniž by to ovlivnilo rodičovský kontext. Toho se dosáhne voláním funkce zrušení, která je vrácena při vytvoření kontextu.
  • Časový limit / Deadline: Omezuje dobu provádění operací. Pokud čas vyprší dříve, než operace skončí, kontext se automaticky zruší.
  • Předávání hodnot: Umožňuje předávat specifické hodnoty požadavku nebo operace dolů v řetězci volání (například ID požadavku, údaje o autentizaci), aniž by se měnily podpisy funkcí.
  • Hierarchie: Vytváří hierarchickou strukturu kontextů. Zrušení rodičovského kontextu automaticky zruší všechny jeho podřízené kontexty.
package main

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

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

	// Vytvoření podřízeného kontextu s zrušením
	childCtx, cancelChild := context.WithCancel(parentCtx)
	defer cancelChild() // Ujistěte se, že podřízený kontext bude zrušen

	// Funkce, která čeká na zrušení kontextu
	go func(ctx context.Context) {
		select {
		case <-ctx.Done():
			// Tento blok se provede, když bude kontext zrušen
			fmt.Println("Podřízená goroutine zrušena:", ctx.Err())
		}
	}(childCtx) // Předání podřízeného kontextu do gorutiny

	// Umělé zpoždění pro demonstraci zrušení
	time.Sleep(5 * time.Second)

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

V tomto příkladu automaticky zruší rodičovský kontext s časovým limitem 3 sekundy, což povede ke zrušení podřízeného kontextu a ukončení gorutiny. Podřízený kontext lze také ručně zrušit voláním cancelChild(), před uplynutím časového limitu rodičovského kontextu.