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