Middle
Τι δυνατότητες παρέχει η δημιουργία ενός παιδικού πλαισίου δεδομένων στο Go;
sobes.tech AI
Απάντηση από AI
Η δημιουργία ενός παιδικού πλαισίου (χρησιμοποιώντας context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) παρέχει τις ακόλουθες δυνατότητες:
- Ακύρωση: Επιτρέπει την ακύρωση των λειτουργιών που ξεκινούν στο παιδικό πλαίσιο χωρίς να επηρεάζει το γονικό. Αυτό επιτυγχάνεται καλώντας τη λειτουργία ακύρωσης που επιστρέφεται κατά τη δημιουργία του πλαισίου.
- Χρονικό όριο / Deadline: Περιορίζει τον χρόνο εκτέλεσης των λειτουργιών. Αν ο χρόνος λήξει πριν ολοκληρωθεί η λειτουργία, το πλαίσιο ακυρώνεται αυτόματα.
- Μεταφορά τιμών: Επιτρέπει τη μεταφορά συγκεκριμένων τιμών για το αίτημα ή τη λειτουργία προς τα κάτω στη αλυσίδα κλήσεων (π.χ., αναγνωριστικό αιτήματος, δεδομένα αυθεντικοποίησης), χωρίς να αλλάζει τις υπογραφές των συναρτήσεων.
- Ιεραρχία: Δημιουργεί μια ιεραρχική δομή πλαισίων. Η ακύρωση του γονικού πλαισίου ακυρώνει αυτόματα όλα τα παιδικά πλαίσια του.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Γονικό πλαίσιο, που ακυρώνεται σε 3 δευτερόλεπτα
parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelParent() // Βεβαιωθείτε ότι το γονικό πλαίσιο θα ακυρωθεί
// Δημιουργία παιδικού πλαισίου με ακύρωση
childCtx, cancelChild := context.WithCancel(parentCtx)
defer cancelChild() // Βεβαιωθείτε ότι το παιδικό πλαίσιο θα ακυρωθεί
// Συνάρτηση που περιμένει την ακύρωση του πλαισίου
go func(ctx context.Context) {
select {
case <-ctx.Done():
// Αυτό το μπλοκ θα εκτελεστεί όταν το πλαίσιο ακυρωθεί
fmt.Println("Το παιδικό goroutine ακυρώθηκε:", ctx.Err())
}
}(childCtx) // Μεταβίβαση του παιδικού πλαισίου στη goroutine
// Τεχνηκή καθυστέρηση για επίδειξη ακύρωσης
time.Sleep(5 * time.Second)
fmt.Println("Το πρόγραμμα ολοκληρώθηκε")
}
Σε αυτό το παράδειγμα, το γονικό πλαίσιο με χρονικό όριο 3 δευτερολέπτων θα ακυρώσει αυτόματα το παιδικό πλαίσιο, οδηγώντας στην τερματισμό της goroutine. Το παιδικό πλαίσιο θα μπορούσε επίσης να ακυρωθεί χειροκίνητα καλώντας cancelChild(), πριν λήξει το χρονικό όριο του γονικού πλαισίου.