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

Comment cloner un contexte Go sans annuler la propagation ?

Linda Hamilton
Libérer: 2024-11-08 14:17:02
original
648 Les gens l'ont consulté

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) }
Copier après la connexion

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

ctxWithoutCancel := WithoutCancel(ctx)
Copier après la connexion

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)
Copier après la connexion

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal