Création d'une copie de contexte sans l'annulation de propagation dans Go
lorsque vous travaillez avec des contextes dans Go, il peut survenir que vous devez créer une copie d'un contexte existant qui contient les mêmes valeurs mais se comporte indépendamment en termes d'incidence. Ce scénario se produit, par exemple, lorsque vous souhaitez effectuer une tâche asynchrone après avoir répondu à une demande HTTP, qui peut survivre au contexte d'origine.
L'approche conventionnelle implique le suivi manuellement de toutes les valeurs possibles stockées dans le contexte et la création d'un nouveau contexte pour copier ces valeurs. Cependant, une solution plus simple et plus gérable est disponible.
Go 1.21 a introduit la fonction sanscancel dans le package de contexte. Cette fonction vous permet de créer un nouveau contexte qui hérite de toutes les valeurs du contexte d'origine mais qui est à l'abri de son annulation:
import "context" // WithoutCancel returns a context that is never canceled. func WithoutCancel(ctx context.Context) context.Context { return context.WithValue(context.Background(), context.NoCancel{}, struct{}{}) }
Pour utiliser sansCancel, enveloppez simplement votre contexte d'origine comme suit:
func Handler(ctx context.Context) (interface{}, error) { result := doStuff(ctx) newContext := context.WithoutCancel(ctx) go func() { doSomethingElse(newContext) }() return result }
Maintenant, le nouveau Goroutine fonctionnera avec une copie du contexte d'origine qui ne sera pas annulé lorsque le contexte d'origine est. Cela offre la flexibilité et le contrôle nécessaires pour gérer la durée de vie des tâches asynchrones.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3