Maison >développement back-end >Golang >Comment créer un contexte dans Go qui ne s'annule pas ?

Comment créer un contexte dans Go qui ne s'annule pas ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-09 06:00:03777parcourir

How to Create a Context in Go that Doesn't Cancel?

Contourner la propagation de l'annulation du contexte

La gestion du contexte dans Go fournit un moyen de transmettre des données entre différentes parties de l'application et de gérer l'annulation. Cependant, le défi se pose lorsque vous avez besoin d'un contexte qui hérite des données d'origine mais reste non affecté par son annulation.

Pour répondre à ce besoin, Go 1.21 introduit la méthode WithoutCancel dans le package de contexte, qui remplit cette exigence.

Alternativement, si vous utilisez une version antérieure de Go, vous pouvez créer votre propre implémentation de contexte spécialement conçue pour empêcher l'annulation. Voici comment :

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) }

// WithoutCancel returns a context that is never canceled.
func WithoutCancel(ctx context.Context) context.Context {
    return noCancel{ctx: ctx}
}

Avec cette implémentation de contexte personnalisé, vous pouvez obtenir une copie du contexte d'origine qui :

  • Hérite de toutes les valeurs stockées dans le contexte d'origine.
  • Reste actif même après l'annulation du contexte d'origine.

Cette approche vous permet d'exécuter des tâches asynchrones dans des goroutines distinctes, garantissant leur exécution même lorsque le contexte parent est terminé.

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