Middle
Welke mogelijkheden biedt het creëren van een onderliggende gegevenscontext in Go?
sobes.tech AI
Antwoord van AI
Het creëren van een kindcontext (met behulp van context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) biedt de volgende mogelijkheden:
- Annulering: Hiermee kunnen operaties die in de kindcontext zijn gestart, worden geannuleerd zonder invloed op de oudercontext. Dit wordt bereikt door de annuleringsfunctie die bij het maken van de context wordt teruggegeven, aan te roepen.
- Tijdslimiet / Deadline: Beperkt de uitvoeringstijd van operaties. Als de tijd verstrijkt voordat de operatie is voltooid, wordt de context automatisch geannuleerd.
- Waardenoverdracht: Hiermee kunnen specifieke waarden voor verzoeken of operaties worden doorgegeven naar beneden in de functieketen (bijvoorbeeld, verzoek-ID, authenticatiegegevens), zonder de functiesignaturen te wijzigen.
- Hiërarchie: Creëert een hiërarchische structuur van contexten. Het annuleren van de oudercontext annuleert automatisch alle onderliggende contexten.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Oudercontext, dat na 3 seconden wordt geannuleerd
parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelParent() // Zorg dat de oudercontext wordt geannuleerd
// Maak een kindcontext met annulering
childCtx, cancelChild := context.WithCancel(parentCtx)
defer cancelChild() // Zorg dat de kindcontext wordt geannuleerd
// Functie die wacht op de annulering van de context
go func(ctx context.Context) {
select {
case <-ctx.Done():
// Deze blok wordt uitgevoerd wanneer de context wordt geannuleerd
fmt.Println("Kind-goroutine geannuleerd:", ctx.Err())
}
}(childCtx) // Geef de kindcontext door aan de goroutine
// Kunstmatige vertraging voor demonstratie van annulering
time.Sleep(5 * time.Second)
fmt.Println("Programma beëindigd")
}
In dit voorbeeld zal de oudercontext met timeout van 3 seconden automatisch de kindcontext annuleren, wat leidt tot het beëindigen van de goroutine. De kindcontext kan ook handmatig worden geannuleerd door cancelChild() aan te roepen, voordat de timeout van de oudercontext verloopt.