Maison >développement back-end >Golang >Pourquoi `defer Cancel()` est-il crucial dans le package contextuel de Go ?

Pourquoi `defer Cancel()` est-il crucial dans le package contextuel de Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-04 07:13:14474parcourir

Why Is `defer cancel()` Crucial in Go's Context Package?

Annulation contextuelle : implications de la négligence des reports

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'importance de l'annulation explicite

L'outil go vet avertit correctement de l'appel defer Cancel() omis. Cet appel est crucial car :

Fuites de mémoire

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.

Gloutons d'étranglement des performances

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.

Bonnes pratiques

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn