Πώς μπορεί κανείς να ελέγξει τον αριθμό των ενεργών νημάτων σε μια εφαρμογή;
sobes.tech AI
Απάντηση από AI
Στη Go, για τον έλεγχο του αριθμού των ενεργών νημάτων (goroutines), χρησιμοποιούνται συνήθως μηχανισμοί συγχρονισμού και περιορισμού του παραλληλισμού:
-
Διαμεταγωγείς με buffer ως σημαφόροι: δημιουργούν έναν διαμεταγωγέα με περιορισμένη χωρητικότητα και, πριν ξεκινήσουν μια goroutine, στέλνουν μια τιμή σε αυτόν, και μετά το τέλος, λαμβάνουν μια, περιορίζοντας έτσι τον αριθμό των ταυτόχρονα λειτουργούντων goroutines.
-
Πακέτο
sync.WaitGroup: βοηθά να περιμένουμε να ολοκληρωθεί μια ομάδα goroutines, αλλά δεν περιορίζει τον αριθμό τους. -
Πακέτο
golang.org/x/sync/semaphore: παρέχει έναν βολικό σημαφόρο για τον περιορισμό του παραλληλισμού.
Παράδειγμα με διαμεταγωγέα-σημαφόρο:
sem := make(chan struct{}, 5) // μέγιστο 5 goroutines ταυτόχρονα
for _, task := range tasks {
sem <- struct{}{} // μπλοκάρει αν ήδη τρέχουν 5 goroutines
go func(t Task) {
defer func() { <-sem }() // ελευθερώνει μια θέση
process(t)
}(task)
}
// Περιμένουμε να ολοκληρωθούν όλες οι goroutines
for i := 0; i < cap(sem); i++ {
sem <- struct{}{}
}
Με αυτόν τον τρόπο, μπορούμε να ελέγξουμε τον αριθμό των ενεργών νημάτων και να αποφύγουμε την υπερβολική κατανάλωση πόρων.