Sobes.tech
Middle

Jakie możliwości daje tworzenie podrzędnego kontekstu danych w Go?

sobes.tech AI

Odpowiedź od AI

Tworzenie kontekstu potomnego (za pomocą context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) zapewnia następujące możliwości:

  • Anulowanie: Pozwala na anulowanie operacji uruchomionych w kontekście potomnym bez wpływu na kontekst nadrzędny. Jest to osiągane przez wywołanie funkcji anulowania zwróconej podczas tworzenia kontekstu.
  • Limit czasu / Deadline: Ogranicza czas wykonywania operacji. Jeśli czas upłynie przed zakończeniem operacji, kontekst jest automatycznie anulowany.
  • Przesyłanie wartości: Pozwala na przekazywanie specyficznych dla żądania lub operacji wartości w dół łańcucha wywołań funkcji (np. identyfikator żądania, dane uwierzytelniające), bez zmiany sygnatur funkcji.
  • Hierarchia: Tworzy hierarchiczną strukturę kontekstów. Anulowanie kontekstu nadrzędnego automatycznie anulowuje wszystkie jego konteksty potomne.
package main

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

func main() {
	// Kontekst nadrzędny, który zostanie anulowany po 3 sekundach
	parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancelParent() // Upewnij się, że kontekst nadrzędny zostanie anulowany

	// Tworzymy kontekst potomny z anulowaniem
	childCtx, cancelChild := context.WithCancel(parentCtx)
	defer cancelChild() // Upewnij się, że kontekst potomny zostanie anulowany

	// Funkcja oczekująca na anulowanie kontekstu
	go func(ctx context.Context) {
		select {
		case <-ctx.Done():
			// Ten blok zostanie wykonany, gdy kontekst zostanie anulowany
			fmt.Println("Kontekst potomny anulowany:", ctx.Err())
		}
	}(childCtx) // Przekazujemy kontekst potomny do goroutine

	// Sztuczne opóźnienie dla demonstracji anulowania
	time.Sleep(5 * time.Second)

	fmt.Println("Program zakończony")
}

W tym przykładzie, kontekst nadrzędny z limitem czasu 3 sekund automatycznie anuluję kontekst potomny, co spowoduje zakończenie goroutine. Kontekst potomny można również ręcznie anulować, wywołując cancelChild(), przed upływem limitu czasu kontekstu nadrzędnego.