Maison  >  Article  >  développement back-end  >  Comment créer une copie de contexte dans Go sans annuler la propagation ?

Comment créer une copie de contexte dans Go sans annuler la propagation ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-08 21:46:01593parcourir

How to Create a Context Copy in Go Without Cancel Propagation?

Création d'une copie de contexte sans propagation d'annulation dans Go

Lorsque vous travaillez avec des contextes dans Go, il peut arriver que vous deviez créer un copie d'un contexte existant qui contient les mêmes valeurs mais se comporte indépendamment en termes d'annulation. Ce scénario se produit, par exemple, lorsque vous souhaitez effectuer une tâche asynchrone après avoir répondu à une requête HTTP, qui peut survivre au contexte d'origine.

L'approche conventionnelle consiste à suivre manuellement toutes les valeurs possibles stockées dans le contexte et à créer 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 WithoutCancel 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 est immunisé contre 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 WithoutCancel, 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
}

Désormais, la nouvelle goroutine fonctionnera avec une copie du contexte d'origine qui ne sera pas annulée lorsque le contexte d'origine l'est. Cela offre la flexibilité et le contrôle nécessaires à la gestion de la durée de vie des tâches asynchrones.

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