Zoeken…


Syntaxis

  • type AnnulerenFunc-functie ()
  • func Achtergrond () Context
  • func TODO () Context
  • func WithCancel (bovenliggende context) (ctx context, annuleer CancelFunc)
  • func WithDeadline (bovenliggende context, deadline time.Time) (context, CancelFunc)
  • func WithTimeout (bovenliggende context, time-out tijd. Duur) (Context, CancelFunc)
  • func WithValue (bovenliggende context, sleutelinterface {}, val-interface {})

Opmerkingen

De context -pakket (in Go 1.7) of de golang.org/x/net/context pakket (Pre 1.7) is een interface voor het creëren van contexten die kunnen worden gebruikt om carry verzoek scoped waarden en deadlines over API grenzen en tussen diensten, alsmede als een eenvoudige implementatie van genoemde interface.

terzijde: het woord "context" wordt losjes gebruikt om te verwijzen naar de hele boom, of naar individuele bladeren in de boom, bijv. de werkelijke context.Context . context.Context .

Op een hoog niveau is een context een boom. Nieuwe bladeren worden aan de boom toegevoegd wanneer ze worden geconstrueerd (een context.Context met een bovenliggende waarde) en bladeren worden nooit uit de boom verwijderd. Elke context heeft toegang tot alle waarden erboven (gegevenstoegang stroomt alleen naar boven), en als een context wordt geannuleerd, worden de onderliggende elementen ook geannuleerd (annuleringssignalen propogeren naar beneden). Het annuleersignaal wordt geïmplementeerd door middel van een functie die een kanaal retourneert dat wordt gesloten (leesbaar) wanneer de context wordt geannuleerd; dit maakt contexten een zeer efficiënte manier om het pijplijn- en annuleringsconcurrentievermogen of time-outs te implementeren.

Volgens afspraak hebben functies die een context aannemen het eerste argument ctx context.Context . Hoewel dit slechts een conventie is, moet deze worden gevolgd, omdat veel tools voor statische analyse specifiek naar dit argument zoeken. Aangezien Context een interface is, is het ook mogelijk om bestaande contextachtige gegevens (waarden die worden doorgegeven in een gehele call-chain) om te zetten in een normale Go-context en ze op een achterwaarts compatibele manier te gebruiken, gewoon door een paar methoden te implementeren. Bovendien zijn contexten veilig voor gelijktijdige toegang, zodat u ze zonder angst kunt gebruiken vanuit vele goroutines (of ze nu op parallelle threads of als gelijktijdige coroutines draaien).

Verder lezen

Contextboom weergegeven als een gerichte grafiek

Een eenvoudige contextstructuur (met enkele veelvoorkomende waarden die mogelijk scoped-aanvraag zijn en in een context zijn opgenomen), opgebouwd uit Go-code zoals de volgende:

// 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())

Is een boom die kan worden weergegeven als een gerichte grafiek die er als volgt uitziet:

Context weergegeven als een gerichte grafiek

Elke onderliggende context heeft toegang tot de waarden van de bovenliggende context, dus de gegevenstoegang stroomt naar boven in de boom (weergegeven door zwarte randen). Annuleren signalen aan de andere kant reizen langs de boom (als een context wordt geannuleerd, worden alle kinderen ook geannuleerd). De annulering signaalstroom wordt vertegenwoordigd door de grijze randen.

Een context gebruiken om het werk te annuleren

Het doorgeven van een context met een time-out (of met een annuleerfunctie) aan een langlopende functie kan worden gebruikt om te annuleren dat functies werken:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow