Sobes.tech
Middle

Ce posibilități oferă crearea unui context de date copil în Go?

sobes.tech AI

Răspuns de la AI

Crearea unui context copil (folosind context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) oferă următoarele posibilități:

  • Anulare: Permite anularea operațiilor inițiate în contextul copil fără a afecta contextul părinte. Acest lucru se realizează apelând funcția de anulare returnată la crearea contextului.
  • Timp limită / Deadline: Limitează timpul de execuție al operațiilor. Dacă timpul expiră înainte ca operația să se finalizeze, contextul este automat anulat.
  • Transmiterea valorilor: Permite transmiterea valorilor specifice pentru solicitare sau operație în jos pe lanțul de apeluri (de exemplu, ID-ul solicitării, datele de autentificare), fără a modifica semnăturile funcțiilor.
  • Ierarhie: Creează o structură ierarhică de contexte. Anularea contextului părinte anulează automat toate contextelor sale copil.
package main

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

func main() {
	// Contextul părinte, care se anulează după 3 secunde
	parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancelParent() // Asigură că contextul părinte va fi anulat

	// Creăm un context copil cu anulare
	childCtx, cancelChild := context.WithCancel(parentCtx)
	defer cancelChild() // Asigură că contextul copil va fi anulat

	// Funcție care așteaptă anularea contextului
	go func(ctx context.Context) {
		select {
		case <-ctx.Done():
			// Acest bloc va fi executat când contextul va fi anulat
			fmt.Println("Goroutine copil anulată:", ctx.Err())
		}
	}(childCtx) // Transmitem contextul copil către goroutine

	// Întârziere artificială pentru demonstrație
	time.Sleep(5 * time.Second)

	fmt.Println("Programul s-a încheiat")
}

În acest exemplu, contextul părinte cu timeout de 3 secunde va anula automat contextul copil, ceea ce va duce la terminarea goroutine-ului. Contextul copil poate fi, de asemenea, anulat manual apelând cancelChild(), înainte ca timeout-ul contextului părinte să expire.