Maison  >  Article  >  développement back-end  >  Comment cloner un contexte Go sans annuler la propagation ?

Comment cloner un contexte Go sans annuler la propagation ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-08 14:17:02597parcourir

How to Clone a Go Context Without Cancel Propagation?

Comment cloner un contexte Go sans annuler la propagation

Dans le langage de programmation Go, un contexte.Le contexte transporte des métadonnées et des signaux d'annulation entre les fonctions et des goroutines. Cependant, il peut être souhaitable de créer une copie d'un contexte qui conserve les mêmes valeurs mais n'hérite pas du statut d'annulation de l'original.

Cas d'utilisation :

Ce scénario se produit lorsque le contexte d'une requête HTTP est annulé après avoir renvoyé la réponse au client, mais que vous devez effectuer une tâche asynchrone dans une goroutine distincte qui survivra probablement au parent. contexte.

Solution :

1. Créer une implémentation de contexte personnalisée :

Avant Go 1.21, une approche consistait à créer votre propre contexte. Implémentation de contexte qui n'est jamais annulée :

import (
    "context"
    "time"
)

type noCancel struct {
    ctx context.Context
}

func (c noCancel) Deadline() (time.Time, bool)       { return time.Time{}, false }
func (c noCancel) Done() <-chan struct{}             { return nil }
func (c noCancel) Err() error                        { return nil }
func (c noCancel) Value(key interface{}) interface{} { return c.ctx.Value(key) }

Ensuite, vous pouvez créer un nouveau contexte utilisant cette implémentation :

ctxWithoutCancel := WithoutCancel(ctx)

2. Utiliser la fonction WithoutCancel (Go 1.21) :

Depuis Go 1.21, le package de contexte inclut une fonction WithoutCancel qui simplifie ce processus :

ctxWithoutCancel := context.WithoutCancel(ctx)

Cette fonction renvoie un nouveau contexte qui partage les mêmes valeurs que le contexte d'origine mais n'est pas soumis à annulation.

Exemple :

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

De cette façon, doSomethingElse continuera à s'exécuter même après l'annulation du contexte de la demande.

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