Czytelnicy tacy jak ty pomagają wspierać MUO. Kiedy dokonujesz zakupu za pomocą linków na naszej stronie, możemy otrzymać prowizję partnerską. Czytaj więcej.

Kontekst jest jedną z krytycznych funkcji Go, która umożliwia współbieżność. W Go „kontekst” odnosi się do pakietu, który zapewnia funkcjonalność dla wartości o zasięgu żądania i sygnałów anulowania poza granicami API.

Pakiet kontekstowy działa jednocześnie z modelem współbieżności Go, opartym na koncepcji gorutyn. Goroutines to lekkie wątki wykonawcze, które można efektywnie tworzyć i nimi zarządzać, ułatwiając tworzenie współbieżnych programów w Go.

Pakiet kontekstowy

Pakiet kontekstowy zapewnia funkcjonalność do anulowania długotrwałych funkcji lub całych łańcuchów wywołań. Pakiet pomaga również w przechowywaniu wartości o zasięgu żądania w celu uzyskania dostępu w dowolnym miejscu w łańcuchu wywołań. Ta funkcja jest przydatna podczas pracy z Pszczoła lub mikrousługi, w przypadku których żądania mogą obejmować wiele wywołań funkcji i chcesz je anulować lub dołączyć do nich określone wartości.

Oto jak możesz zaimportować pakiet kontekstowy do swojego Idź programy.

import"kontekst"

Funkcje kontekstowe zajmują Kontekst typ struktury pakietu kontekstowego. Tradycyjnie powinieneś użyć ctx jako nazwa zmiennej instancji.

funkcjaoperacje(kontekst ctx. Kontekst) {
}

Funkcje mogą zwracać typ struktury kontekstu dla innych funkcji i operacji.

funkcjaoperacje(kontekst ctx. Kontekst)kontekst.Kontekst {
}

Możesz utworzyć nowy kontekst za pomocą DO ZROBIENIA funkcja pakietu kontekstowego. Funkcja TODO tworzy nowy kontekst o wartości kontekst. Zrobione(), kanał, który zostanie zamknięty po anulowaniu kontekstu. Powinieneś użyć go jako symbolu zastępczego, gdy potrzebujesz kontekstu, ale żadne konteksty nadrzędne nie są odpowiednie.

import"kontekst"

funkcjagłówny() {
ctx:= kontekst. DO ZROBIENIA()
}

Alternatywnie, Tło tworzy nowy kontekst bez wartości i pusty kanał Done.

ctx:= kontekst. Tło()

Powinieneś użyć funkcji Background jako korzenia drzewa kontekstu.

Kontekst z wartościami

Pakiet kontekstu zapewnia funkcjonalność propagowania wartości i sygnałów anulowania. Możesz użyć tych wartości, aby uzyskać informacje od danych o zakresie żądania do sygnałów anulowania i terminów.

Pakiet context pozwala również na tworzenie kontekstów potomnych dziedziczonych z kontekstów nadrzędnych, co pozwala na wydajne obsługa wartości i sygnałów anulowania w całym programie, ponieważ można przekazywać kontekst przez wiele Funkcje.

Oto przykład przekazywania kontekstu przez funkcje za pomocą pakietu context.

import (
"kontekst"
)

funkcjawartościowykontekst(kontekst ctx. Kontekst)kontekst.Kontekst {
powrót kontekst. Z wartością (ctx, "klucz uniwersalny", "hfouneqcelkwfu")
}

funkcjaodbieraćDaneKontekstu(kontekst ctx. Kontekst)każdy {
passKey := ctx. Wartość("klucz uniwersalny")
powrót klucz uniwersalny
}

The wartościowykontekst funkcja przyjmuje instancję kontekstu i zwraca instancję kontekstu dla następującej funkcji. Instancja kontekstu jest wartością utworzoną za pomocą z wartością metoda. Metoda WithValue pobiera instancję kontekstu z funkcji i pary klucz-wartość.

Aby pobrać dane z kontekstu, musisz utworzyć nowy kontekst za pomocą pliku DO ZROBIENIA Lub Tło function i przekaż kontekst do funkcji (w tym przypadkuvalueContext) i odbierz kontekst za pomocą odbieraćDaneKontekstu funkcjonować.

funkcjagłówny() {
ctx:= kontekst. Tło()
ctx = wartościowykontekst (ctx)
fmt. Println (odbiór danych kontekstu (ctx))

}

Zmienna ctx jest instancją kontekstu z funkcji Background. FunkcjavalueContext przyjmuje zmienną ctx i zwraca kontekst z wartością, którą przyjmuje funkcja receiveContextData i zwraca wartość z pary klucz-wartość.

Limity czasu i terminy kontekstu

The kontekst pakiet udostępnia funkcjonalność do ustawiania limitów czasu i terminów w operacjach. Ustawianie limitów czasu i terminów jest przydatne w przypadku operacji, które muszą nadrobić zaległości.

Limity czasu to czas trwania operacji. Możesz ustawić limit czasu operacji na 4 sekundy; po tym kontekst anuluje żądanie.

Z drugiej strony termin definiuje bezwzględny punkt, w którym operacja powinna zostać anulowana.

Możesz użyć Z limitem czasu metoda ustawiania limitu czasu kontekstu. Oto jak ustawić 2-sekundowy limit czasu.

funkcjagłówny() {
ctx, anuluj:= kontekst. Bez limitu czasu (kontekst. Tło(), 2 * czas. Drugi)
odraczać anulować()

// jakaś operacja
}

The główny Funkcja tworzy kontekst z limitem czasu wynoszącym dwie sekundy. Funkcja WithTimeout zwraca funkcję anulowania, którą można odroczyć do anulowania przy wyjściu z funkcji main.

Możesz zadeklarować terminy za pomocą Z terminem metoda. Metoda WithDeadline przyjmuje instancję kontekstu i termin ostateczny.

funkcjaZrób coś(kontekst ctx. Kontekst) {
ostateczny czas:= czas. Teraz().Dodaj(1500 * czas. milisekunda)
ctx, ctxAnuluj := kontekst. WithDeadline (ctx, deadlineTime)
odraczać ctxAnuluj()

// jakaś operacja

ctxAnuluj()
}

The Zrób coś funkcja przyjmuje kontekst, a terminCzas zmienna to czas przed kontekst termin ostateczny. The ctx zmienna to kontekst z terminem.

The ctxAnuluj zmienna anuluje kontekst, gdy kontekst przekroczy swój termin.

Najlepsze praktyki dotyczące używania kontekstów w Go

Unikaj używania kontekstów jako zmiennych globalnych. Używanie kontekstów jako zmiennych globalnych może prowadzić do nieoczekiwanych zachowań kodu i trudnych do wyśledzenia błędów, a także oszczędnie używać kontekstu, aby zmniejszyć złożoność kodu.

Wreszcie, używaj kontekstów jako sygnałów, a nie gwarancji. Anulowanie kontekstu nie gwarantuje, że wszystkie goroutines przestaną działać; to tylko sygnał, a goroutines są niezależne od kontekstów.