Sobes.tech
Middle

Welche Möglichkeiten bietet die Erstellung eines untergeordneten Datenkontexts in Go?

sobes.tech KI

Antwort von AI

Das Erstellen eines Kindkontexts (mithilfe von context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) bietet die folgenden Möglichkeiten:

  • Abbruch: Ermöglicht das Abbrechen von Operationen, die im Kindkontext gestartet wurden, ohne den Elternkontext zu beeinflussen. Dies wird durch Aufrufen der beim Erstellen des Kontexts zurückgegebenen Abbruchfunktion erreicht.
  • Timeout / Deadline: Begrenzen die Ausführungszeit von Operationen. Wenn die Zeit vor Abschluss der Operation abläuft, wird der Kontext automatisch abgebrochen.
  • Wertübertragung: Ermöglicht das Weitergeben von spezifischen Werten für Anfragen oder Operationen nach unten in der Funktionskette (z.B. Anforderungs-ID, Authentifizierungsdaten), ohne die Funktionssignaturen zu ändern.
  • Hierarchie: Erstellt eine hierarchische Struktur von Kontexten. Das Abbrechen des Elternkontexts bricht automatisch alle seine Kindkontexte ab.
package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	// Elternkontext, der nach 3 Sekunden abgebrochen wird
	parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancelParent() // Sicherstellen, dass der Elternkontext abgebrochen wird

	// Erstellen eines Kindkontexts mit Abbruch
	childCtx, cancelChild := context.WithCancel(parentCtx)
	defer cancelChild() // Sicherstellen, dass der Kindkontext abgebrochen wird

	// Funktion, die auf den Abbruch des Kontexts wartet
	go func(ctx context.Context) {
		select {
		case <-ctx.Done():
			// Dieser Block wird ausgeführt, wenn der Kontext abgebrochen wird
			fmt.Println("Kind-Goroutine abgebrochen:", ctx.Err())
		}
	}(childCtx) // Übergabe des Kindkontexts an die Goroutine

	// Künstliche Verzögerung zur Demonstration des Abbruchs
	time.Sleep(5 * time.Second)

	fmt.Println("Programm beendet")
}

In diesem Beispiel führt der Elternkontext mit Timeout nach 3 Sekunden automatisch zum Abbruch des Kindkontexts, was zum Beenden der Goroutine führt. Der Kindkontext könnte auch manuell durch Aufruf von cancelChild() abgebrochen werden, vor Ablauf des Timeout des Elternkontexts.