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.