Middle
Milyen lehetőségeket kínál a gyermek adatkontextus létrehozása Go-ban?
sobes.tech MI
Válasz az MI-től
A gyermekkontekstuk (a context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue segítségével történő létrehozásával) a következő lehetőségeket kínálja:
- Mégse: Lehetővé teszi a gyermekkontektsben indított műveletek megszakítását anélkül, hogy befolyásolná a szülőkontekstet. Ez a létrehozáskor visszaadott megszakítási függvény meghívásával érhető el.
- Idő / Határidő: Korlátozza a műveletek végrehajtási idejét. Ha az idő lejár, mielőtt a művelet befejeződne, a kontextus automatikusan megszakad.
- Értékek továbbítása: Lehetővé teszi a kéréshez vagy művelethez kapcsolódó specifikus értékek lefelé történő továbbítását a függvényhívási láncban (például kérésazonosító, hitelesítési adatok), anélkül, hogy megváltoztatná a függvényaláírásokat.
- Hierarchia: Hierarchikus szerkezetet hoz létre a kontextusok között. A szülő kontextus megszakítása automatikusan megszakítja az összes gyermekkontextusát.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Szülő kontextus, amely 3 másodperc múlva megszakad
parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelParent() // Győződjön meg róla, hogy a szülő kontextus megszakad
// Gyermekkontextus létrehozása megszakítással
childCtx, cancelChild := context.WithCancel(parentCtx)
defer cancelChild() // Győződjön meg róla, hogy a gyermekkontextus megszakad
// Funkció, amely várja a kontextus megszakítását
go func(ctx context.Context) {
select {
case <-ctx.Done():
// Ez a blokk akkor fut le, amikor a kontextus megszakad
fmt.Println("Gyermek goroutine megszakadt:", ctx.Err())
}
}(childCtx) // A gyermekkontextus átadása a goroutine-nak
// Mesterséges késleltetés a megszakítás demonstrálására
time.Sleep(5 * time.Second)
fmt.Println("A program befejeződött")
}
Ebben a példában a 3 másodperces időkorláttal rendelkező szülő kontextus automatikusan megszakítja a gyermekkontextust, ami a goroutine leállásához vezet. A gyermekkontextust manuálisan is megszakíthatja a cancelChild() meghívásával, még a szülő kontextus időkorlátjának lejárta előtt.