Middle
Mi az a kontextus a Go-ban? Mire használják? Hogyan működik a timeout szerinti megszakítás?
sobes.tech MI
Válasz az MI-től
A Go-ban a context egy csomag és egy fogalom az műveletek életciklusának kezelésére, a megszakítási jelek továbbítására és az időkorlátok beállítására goroutine-ok között.
A kontextus fő feladatai:
- Műveletek megszakítása (pl. időtúllépés vagy felhasználói megszakítás esetén),
- Értékek továbbítása (pl. kérésazonosító) a hívási láncon keresztül,
- Időkorlátok (timeoutok) beállítása.
Az időtúllépéses megszakítás így működik:
- Létrehozunk egy kontextust időkorláttal vagy timeout-tal, például
context.WithTimeoutsegítségével. - Az idő letelte után a kontextus automatikusan megszakad.
- A goroutine, amely ezt a kontextust figyeli, a
Done()csatornán keresztül kap egy megszakítási jelet. - A goroutine-nak helyesen kell kezelnie a megszakítást (pl. munkát megszakítani és erőforrásokat felszabadítani).
Példa:
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
select {
case <-time.After(3 * time.Second):
fmt.Println("művelet befejeződött")
case <-ctx.Done():
fmt.Println("művelet megszakadt vagy időtúllépés")
}
Itt a művelet 2 másodperc múlva megszakad, ha nem fejeződik be korábban.