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.