Szukaj…
Składnia
- wpisz CancelFunc func ()
- Kontekst func Background ()
- func TODO () Kontekst
- func WithCancel (kontekst macierzysty) (kontekst ctx, anuluj Anuluj)
- func WithDeadline (kontekst macierzysty, termin) Czas) (kontekst, CancelFunc)
- func WithTimeout (kontekst macierzysty, limit czasu. Czas trwania) (kontekst, CancelFunc)
- func WithValue (kontekst nadrzędny, interfejs klucza {}, interfejs val {})
Uwagi
Pakiet context
(w wersji Go 1.7) lub pakiet golang.org/x/net/context
(wcześniejszy niż 1.7) to interfejs do tworzenia kontekstów, które można wykorzystać do przenoszenia wartości i terminów o zasięgu żądania między granicami API i między usługami, a także jako prosta implementacja wspomnianego interfejsu.
na bok: słowo „kontekst” jest luźno używane w odniesieniu do całego drzewa lub poszczególnych liści w drzewie, np. rzeczywisty context.Context
. wartości context.Context
.
Na wysokim poziomie kontekst jest drzewem. Nowe liście są dodawane do drzewa podczas ich budowy ( context.Context
z wartością nadrzędną), a liście nigdy nie są usuwane z drzewa. Dowolny kontekst ma dostęp do wszystkich powyższych wartości (dostęp do danych płynie tylko w górę), a jeśli jakikolwiek kontekst zostanie anulowany, jego dzieci również zostaną anulowane (sygnały anulowania propagują w dół). Sygnał anulowania jest implementowany za pomocą funkcji, która zwraca kanał, który zostanie zamknięty (czytelny), gdy kontekst zostanie anulowany; sprawia to, że konteksty są bardzo wydajnym sposobem na wdrożenie wzorca współbieżności potoków i anulowania lub limitów czasu.
Zgodnie z konwencją funkcje pobierające kontekst mają pierwszy argument ctx context.Context
. Chociaż jest to tylko konwencja, należy jej przestrzegać, ponieważ wiele narzędzi analizy statycznej szuka tego argumentu. Ponieważ Kontekst jest interfejsem, możliwe jest również przekształcenie istniejących danych kontekstowych (wartości, które są przekazywane w całym łańcuchu wywołań żądania) w normalny kontekst Go i użycie ich w sposób kompatybilny wstecz tylko za pomocą kilku metod. Co więcej, konteksty są bezpieczne dla równoczesnego dostępu, więc możesz ich używać z wielu goroutine (niezależnie od tego, czy działają na równoległych wątkach, czy jako równoległe coroutines) bez obaw.
Dalsza lektura
Drzewo kontekstu reprezentowane jako ukierunkowany wykres
Proste drzewo kontekstowe (zawierające niektóre typowe wartości, które mogą mieć zasięg zapytania i zawarte w kontekście) zbudowane z kodu Go, takie jak:
// 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())
To drzewo, które może być reprezentowane jako ukierunkowany wykres, który wygląda następująco:
Każdy kontekst potomny ma dostęp do wartości swoich kontekstów nadrzędnych, więc dostęp do danych przepływa w górę drzewa (reprezentowane przez czarne krawędzie). Z drugiej strony sygnały anulowania przechodzą w dół drzewa (jeśli kontekst zostanie anulowany, wszystkie jego dzieci również zostaną anulowane). Przepływ sygnału anulowania jest reprezentowany przez szare krawędzie.
Używanie kontekstu do anulowania pracy
Przekazywanie kontekstu z limitem czasu (lub funkcją anulowania) do funkcji długotrwałego działania może być użyte do anulowania tej funkcji:
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!
}
}