Middle
Quelles fonctionnalités offre la création d'un contexte de données enfant en Go?
sobes.tech IA
Réponse de l'IA
La création d’un contexte enfant (en utilisant context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) offre les fonctionnalités suivantes :
- Annulation : Permet d’annuler l’exécution des opérations lancées dans le contexte enfant sans affecter le contexte parent. Cela se fait en appelant la fonction d’annulation retournée lors de la création du contexte.
- Timeout / Deadline : Limite le temps d’exécution des opérations. Si le temps expire avant la fin de l’opération, le contexte est automatiquement annulé.
- Transmission de valeurs : Permet de transmettre des valeurs spécifiques à la requête ou à l’opération vers le bas dans la chaîne d’appels (par exemple, identifiant de requête, données d’authentification), sans modifier la signature des fonctions.
- Hiérarchie : Crée une structure hiérarchique de contextes. L’annulation du contexte parent annule automatiquement tous ses contextes enfants.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Contexte parent, annulé après 3 secondes
parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelParent() // S’assurer que le contexte parent sera annulé
// Créer un contexte enfant avec annulation
childCtx, cancelChild := context.WithCancel(parentCtx)
defer cancelChild() // S’assurer que le contexte enfant sera annulé
// Fonction qui attend l’annulation du contexte
go func(ctx context.Context) {
select {
case <-ctx.Done():
// Ce bloc s’exécutera lorsque le contexte sera annulé
fmt.Println("Goroutine enfant annulée :", ctx.Err())
}
}(childCtx) // Passer le contexte enfant à la goroutine
// Retard artificiel pour démonstration de l’annulation
time.Sleep(5 * time.Second)
fmt.Println("Programme terminé")
}
Dans cet exemple, le contexte parent avec timeout de 3 secondes annulera automatiquement le contexte enfant, ce qui entraînera la fin de la goroutine. Le contexte enfant pourrait également être annulé manuellement en appelant cancelChild(), avant l’expiration du timeout du contexte parent.