Défaut d'annulation du contexte : conséquences et résolution
Dans le paysage concurrentiel de Go, un contexte régit la durée de vie et le comportement des goroutines. Il fournit un moyen de propager les délais, les signaux d’annulation et d’autres informations essentielles. Cependant, ne pas annuler correctement un contexte peut entraîner des conséquences indésirables.
Considérez l'extrait de code suivant :
func Call(ctx context.Context, payload Payload) (Response, error) { req, err := http.NewRequest(...) // Some code that creates request from payload ctx, cancel = context.WithTimeout(ctx, time.Duration(3) * time.Second) defer cancel() return http.DefaultClient.Do(req) }
Ici, un nouveau contexte est créé avec un délai d'attente de 3 secondes. Sans l'instruction defer Cancel(), la fonction renvoie sans annuler explicitement le contexte. Cela déclenche un avertissement de go vet :
la fonction d'annulation renvoyée par context.WithTimeout doit être appelée, et non supprimée, pour éviter une fuite de contexte
Alors, que se passe-t-il si le Contexte n'est pas annulé ? Cette omission crée une « fuite » dans le système. La goroutine chargée de gérer l'annulation du Contexte reste active indéfiniment, même si elle ne sert à rien. Ce gaspillage de ressources peut entraîner une surcharge de mémoire importante si cela se produit fréquemment au sein du programme.
Pour éviter les fuites de contexte, il est considéré comme une bonne pratique de différer immédiatement l'annulation ( ) après avoir créé un nouveau contexte avec WithCancel() ou WithTimeout(). Cela garantit que la logique d'annulation est exécutée dès le retour de la fonction, quels que soient les retours anticipés ou les exceptions.
En résumé, négliger d'annuler un contexte peut entraîner des fuites de mémoire en laissant les goroutines s'exécuter indéfiniment. Pour éviter cela, différez toujours la fonction d'annulation immédiatement après la création d'un nouveau Context avec WithCancel() ou WithTimeout().
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!