Dans Go, le package contextuel fournit des mécanismes de gestion des délais de demande et de l'annulation. Des fuites de contexte peuvent se produire si les rappels d'annulation ne sont pas invoqués, entraînant des opérations de nettoyage gourmandes en ressources et des répercussions potentielles sur les performances.
Considérez l'extrait de code suivant :
func Call(ctx context.Context, payload Payload) (Response, error) { req, err := http.NewRequest(...) ctx, cancel = context.withTimeout(ctx, time.Duration(3) * time.Second) // defer cancel() missing! return http.DefaultClient.Do(req) }
L'outil go vet avertit correctement de l'appel defer Cancel() omis. Cet appel est crucial car :
Sans l'appel d'annulation, la goroutine créée par WithCancel ou WithTimeout reste indéfiniment en mémoire (jusqu'à l'arrêt du programme), entraînant une fuite de mémoire. Si ce comportement se répète plusieurs fois, l'utilisation de la mémoire va monter en flèche.
Les contextes non annulés peuvent provoquer des goulots d'étranglement des performances. Lorsqu'une requête HTTP pour laquelle un contexte a été annulé reste incomplète, des ressources sont consommées pour la gérer ainsi que les tentatives potentielles de requête.
Pour éviter les fuites de contexte et garantir une gestion efficace des ressources, il est meilleure pratique pour utiliser defer Cancel() immédiatement après avoir appelé WithCancel() ou WithTimeout(). Cela garantit que les opérations de nettoyage sont déclenchées rapidement lorsque le contexte n'est plus nécessaire.
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!