Sobes.tech
Junior — Middle

Πώς μπορεί κανείς να ελέγξει τον αριθμό των ενεργών νημάτων σε μια εφαρμογή;

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{}{}
}

Με αυτόν τον τρόπο, μπορούμε να ελέγξουμε τον αριθμό των ενεργών νημάτων και να αποφύγουμε την υπερβολική κατανάλωση πόρων.