Kontekst er en av de kritiske funksjonene i Go som muliggjør samtidighet. I Go refererer "kontekst" til en pakke som gir funksjonalitet for forespørselsbaserte verdier og kanselleringssignaler på tvers av API-grenser.
Kontekstpakken fungerer samtidig med Gos samtidighetsmodell, basert på begrepet goroutiner. Goroutiner er lette utførelsestråder som du kan opprette og administrere effektivt, noe som gjør det enkelt å lage samtidige programmer i Go.
Kontekstpakken
Kontekstpakken gir funksjonalitet for å kansellere langvarige funksjoner eller hele anropskjeder. Pakken hjelper også med å lagre forespørselsbaserte verdier for tilgang hvor som helst i anropskjeden. Denne funksjonen er nyttig når du arbeider med APIer eller mikrotjenester, der forespørsler kan spenne over flere funksjonsanrop og du ønsker å kansellere dem eller knytte spesifikke verdier til dem.
Slik kan du importere kontekstpakken i din Gå programmer.
import"kontekst"
Kontekstfunksjoner tar inn Kontekst strukturtypen til kontekstpakken. Konvensjonelt bør du bruke ctx som navnet på forekomstvariabelen.
funcoperasjoner(ctx kontekst. Kontekst) {
}
Funksjoner kan returnere Context struct-typen for andre funksjoner og operasjoner.
funcoperasjoner(ctx kontekst. Kontekst)kontekst.Kontekst {
}
Du kan opprette en ny kontekst med Å GJØRE funksjonen til kontekstpakken. TODO-funksjonen skaper en ny kontekst med verdien av kontekst. Ferdig(), en kanal som stenges ved kansellering av kontekst. Du bør bruke den som en plassholder når du trenger en kontekst, men ingen overordnede kontekster er egnet.
import"kontekst"
funchoved-() {
ctx := kontekst. Å GJØRE()
}
Alternativt kan Bakgrunn funksjonen skaper en ny kontekst uten verdi og en tom Ferdig-kanal.
ctx := kontekst. Bakgrunn()
Du bør bruke bakgrunnsfunksjonen som roten til et konteksttre.
Kontekst med verdier
Kontekstpakken gir funksjonalitet for utbredelse av verdier og kanselleringssignaler. Du kan bruke verdiene for informasjon fra forespørselsbaserte data til kanselleringssignaler og frister.
Kontekstpakken tillater også opprettelse av barnekontekst arvet fra foreldrekontekster, noe som muliggjør effektiv håndtering av verdier og kanselleringssignaler gjennom et program siden du kan sende konteksten gjennom flere funksjoner.
Her er et eksempel på å sende kontekst gjennom funksjoner med kontekstpakken.
import (
"kontekst"
)funcverdifull kontekst(ctx kontekst. Kontekst)kontekst.Kontekst {
komme tilbake kontekst. WithValue (ctx, "pass-nøkkel", "hfouneqcelkwfu")
}
funcmottaContextData(ctx kontekst. Kontekst)noen {
adgangsnøkkel := ctx. Verdi("pass-nøkkel")
komme tilbake adgangsnøkkel
}
De verdifull kontekst funksjon tar inn en kontekstforekomst og returnerer en kontekstforekomst for følgende funksjon. Kontekstforekomsten er en verdi skapt med Med Verdi metode. WithValue-metoden tar kontekstforekomsten fra funksjonen og et nøkkelverdi-par.
For å hente dataene fra konteksten, må du opprette en ny kontekst med Å GJØRE eller Bakgrunn funksjon og send konteksten til funksjonen (i dette tilfellet valuableContext) og motta konteksten med mottaContextData funksjon.
funchoved-() {
ctx := kontekst. Bakgrunn()
ctx = verdifull kontekst (ctx)
fmt. Println (receiveContextData (ctx))
}
Ctx-variabelen er kontekstforekomsten fra bakgrunnsfunksjonen. valuableContext-funksjonen tar inn ctx-variabelen og returnerer konteksten med en verdi som receiveContextData-funksjonen tar inn og returnerer verdien fra nøkkelverdi-paret.
Tidsavbrudd og tidsfrister for kontekst
De kontekst pakken gir funksjonalitet for innstilling av tidsavbrudd og tidsfrister i operasjoner. Å angi tidsavbrudd og tidsfrister er nyttig for operasjoner som må innhente.
Tidsavbrudd er varigheten av tiden en operasjon tar. Du kan angi et tidsavbrudd for en operasjon som skal ta 4 sekunder; etter det kansellerer konteksten forespørselen.
På den annen side definerer en frist det absolutte punktet hvor en operasjon skal kanselleres.
Du kan bruke WithTimeout metode for å angi en konteksttidsavbrudd. Slik kan du angi en 2-sekunders tidsavbrudd.
funchoved-() {
ctx, avbryt := kontekst. WithTimeout (kontekst. Bakgrunn(), 2 * tid. Sekund)
utsette Avbryt()
// noen operasjon
}
De hoved- funksjonen skaper en kontekst med et tidsavbrudd på to sekunder. WithTimeout-funksjonen returnerer en kanselleringsfunksjon du kan utsette for kansellering når hovedfunksjonen avsluttes.
Du kan erklære frister med Med Frist metode. WithDeadline-metoden tar i en kontekstforekomst og en tidsfrist.
funcgjør noe(ctx kontekst. Kontekst) {
deadlineTid := tid. Nå().Legg til(1500 * tid. millisekund)
ctx, ctxCancel := kontekst. WithDeadline (ctx, deadlineTime)
utsette ctxCancel()// noen operasjon
ctxCancel()
}
De gjør noe funksjonen tar inn en kontekst, og fristTid variabel er tiden før kontekst frist. De ctx variabel er konteksten med en frist.
De ctxCancel variabel kansellerer konteksten når konteksten overskrider fristen.
Beste praksis for bruk av kontekster i farten
Unngå å bruke kontekster som globale variabler. Bruk av kontekster som globale variabler kan føre til uventet kodeatferd og vanskelig å spore feil, og bruk kontekst sparsomt for å redusere kodekompleksiteten.
Til slutt, bruk kontekster som signaler, ikke garantier. Å avbryte en kontekst garanterer ikke at alle goroutiner vil slutte å kjøre; det er bare et signal, og goroutiner er agnostiske overfor sammenhenger.