Middle
Quali possibilità offre la creazione di un contesto dati figlio in Go?
sobes.tech AI
Risposta dell'AI
La creazione di un contesto figlio (utilizzando context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) offre le seguenti funzionalità:
- Annullamento: Permette di annullare l'esecuzione di operazioni avviate nel contesto figlio senza influenzare quello genitore. Ciò si ottiene chiamando la funzione di annullamento restituita alla creazione del contesto.
- Timeout / Deadline: Limita il tempo di esecuzione delle operazioni. Se il tempo scade prima che l'operazione termini, il contesto viene automaticamente annullato.
- Trasmissione di valori: Permette di trasmettere valori specifici della richiesta o dell'operazione verso il basso nella catena di chiamate (ad esempio, ID richiesta, dati di autenticazione), senza modificare le firme delle funzioni.
- Gerarchia: Crea una struttura gerarchica di contesti. L'annullamento del contesto genitore annulla automaticamente tutti i suoi contesti figli.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Contesto genitore, che viene annullato dopo 3 secondi
parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelParent() // Assicuriamoci che il contesto genitore venga annullato
// Creiamo un contesto figlio con annullamento
childCtx, cancelChild := context.WithCancel(parentCtx)
defer cancelChild() // Assicuriamoci che il contesto figlio venga annullato
// Funzione che attende l'annullamento del contesto
go func(ctx context.Context) {
select {
case <-ctx.Done():
// Questo blocco verrà eseguito quando il contesto sarà annullato
fmt.Println("Goroutine figlia annullata:", ctx.Err())
}
}(childCtx) // Passiamo il contesto figlio alla goroutine
// Ritardo artificiale per dimostrazione dell'annullamento
time.Sleep(5 * time.Second)
fmt.Println("Programma terminato")
}
In questo esempio, il contesto genitore con timeout di 3 secondi annullerà automaticamente il contesto figlio, portando alla terminazione della goroutine. Il contesto figlio può essere anche annullato manualmente chiamando cancelChild(), prima che scada il timeout del contesto genitore.