Recherche…


Syntaxe

  • tapez CancelFunc func ()
  • func Background () Contexte
  • func TODO () Contexte
  • func WithCancel (contexte parent) (contexte ctx, annuler CancelFunc)
  • func WithDeadline (contexte parent, heure limite.Time) (Contexte, CancelFunc)
  • func WithTimeout (contexte parent, timeout time.Duration) (Context, CancelFunc)
  • func WithValue (Contexte parent, interface clé {}, interface val {})

Remarques

Le paquet de context (dans Go 1.7) ou le paquet golang.org/x/net/context (Pre 1.7) est une interface permettant de créer des contextes pouvant être utilisés pour transporter des valeurs et des délais de requête entre les limites des API et entre les services. comme simple implémentation de ladite interface.

à part: le mot "contexte" est généralement utilisé pour désigner l’arbre entier ou des feuilles individuelles dans l’arbre, par exemple. les valeurs context.Context réelles.

À un niveau élevé, un contexte est un arbre. De nouvelles feuilles sont ajoutées à l'arborescence lors de leur construction (un context.Context avec une valeur parente) et les feuilles ne sont jamais supprimées de l'arborescence. Tout contexte a accès à toutes les valeurs au-dessus (l'accès aux données ne circule que vers le haut) et si un contexte est annulé, ses enfants sont également annulés (les signaux d'annulation sont propagés vers le bas). Le signal d'annulation est implémenté au moyen d'une fonction qui renvoie un canal qui sera fermé (lisible) lorsque le contexte est annulé; Cela rend les contextes très efficaces pour implémenter le modèle de concurrence de pipeline et d'annulation , ou les délais d'attente.

Par convention, les fonctions qui prennent un contexte ont le premier argument ctx context.Context . Bien qu'il ne s'agisse que d'une convention, il convient de la suivre, car de nombreux outils d'analyse statique recherchent spécifiquement cet argument. Étant donné que Context est une interface, il est également possible de transformer des données contextuelles existantes (valeurs transmises lors d'une chaîne d'appels) en un contexte Go normal et de les utiliser de manière rétrocompatible en implémentant quelques méthodes. De plus, les contextes sont sécurisés pour un accès simultané, de sorte que vous pouvez les utiliser depuis de nombreuses goroutines (qu'elles s'exécutent sur des threads parallèles ou des coroutines simultanées) sans crainte.

Lectures complémentaires

Arbre de contexte représenté sous forme de graphe orienté

Une simple arborescence de contexte (contenant des valeurs communes pouvant être définies et incluses dans un contexte), construite à partir du code Go, comme suit:

// Pseudo-Go
ctx := context.WithValue(
    context.WithDeadline(
        context.WithValue(context.Background(), sidKey, sid),
        time.Now().Add(30 * time.Minute),
    ),
    ridKey, rid,
)
trCtx := trace.NewContext(ctx, tr)
logCtx := myRequestLogging.NewContext(ctx, myRequestLogging.NewLogger())

Est-ce un arbre qui peut être représenté comme un graphique dirigé qui ressemble à ceci:

Contexte représenté sous forme de graphe orienté

Chaque contexte enfant a accès aux valeurs de ses contextes parents, de sorte que l'accès aux données circule vers le haut dans l'arborescence (représentée par des bords noirs). Les signaux d’annulation, en revanche, descendent dans l’arbre (si un contexte est annulé, tous ses enfants sont également annulés). Le flux du signal d'annulation est représenté par les bords gris.

Utiliser un contexte pour annuler le travail

Passer un contexte avec un timeout (ou avec une fonction d'annulation) à une fonction longue peut être utilisé pour annuler le fonctionnement des fonctions:

ctx, _ := context.WithTimeout(context.Background(), 200*time.Millisecond)
for {
    select {
    case <-ctx.Done():
        return ctx.Err()
    default:
        // Do an iteration of some long running work here!
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow