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.