Sobes.tech
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:

  1. Létrehozunk egy kontextust időkorláttal vagy timeout-tal, például context.WithTimeout segítségével.
  2. Az idő letelte után a kontextus automatikusan megszakad.
  3. A goroutine, amely ezt a kontextust figyeli, a Done() csatornán keresztül kap egy megszakítási jelet.
  4. 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.