Maison  >  Article  >  développement back-end  >  Comment puis-je utiliser les contextes dans Go sans propagation d'annulation ?

Comment puis-je utiliser les contextes dans Go sans propagation d'annulation ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-08 20:57:021004parcourir

How Can I Use Contexts in Go Without Cancellation Propagation?

Contexte sans propagation d'annulation : une plongée approfondie

Context in Go fournit un mécanisme pour transmettre des valeurs arbitraires avec les requêtes et suivre les annulations. Par défaut, tous les contextes partagent le même mécanisme d'annulation. Cependant, certains scénarios peuvent nécessiter un découplage de la propagation du contexte de l'annulation.

Le besoin de contextes sans annulation

Considérons un gestionnaire HTTP qui effectue des tâches au-delà de la durée de vie de la requête. Après avoir renvoyé une réponse, le gestionnaire peut lancer une tâche asynchrone dans une goroutine. Cette tâche peut nécessiter l'accès aux valeurs de contexte, mais ne doit pas être terminée si le contexte de la demande d'origine est annulé.

Création de contextes personnalisés sans annulation

WithoutCancel a été introduit dans Go 1.21, offrant un moyen simple pour créer des contextes non annulants. En utilisant cette méthode, on peut obtenir une copie du contexte d'origine qui contient toutes ses valeurs stockées mais reste indépendante de son statut d'annulation.

Implémentation de contextes sans annulation

Avant Go 1.21, des contextes personnalisés des implémentations de contextes sans annulation étaient nécessaires. La clé est de créer un type qui satisfait à l'interface context.Context et remplace les méthodes suivantes pour empêcher l'annulation :

  • Deadline() : renvoie toujours une heure nulle et définit la deuxième valeur de retour sur false, n'indiquant aucune date limite.
  • Done() : renvoie un canal nul, indiquant qu'aucune annulation n'est possible.
  • Err() : renvoie toujours nul, indiquant qu'aucune erreur ne s'est produite.

De plus, l'implémentation doit stocker le contexte d'origine et déléguer les appels Value() pour récupérer les valeurs stockées.

Exemple d'utilisation d'un contexte sans annulation

import (
    "context"

    "github.com/mypackage/mycontext"
)

func Handler(ctx context.Context) (interface{}, error) {
    result := doStuff(ctx)
    newContext := mycontext.WithoutCancel(ctx)
    go func() {
        doSomethingElse(newContext)
    }()
    return result
}

Conclusion

En comprenant les principes derrière les contextes de non-annulation et en tirant parti des outils disponibles, les développeurs peuvent créer des solutions personnalisées ou utiliser la fonctionnalité intégrée de Go pour obtenir la propagation du contexte souhaité sans annulation.

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