Sobes.tech
Junior — Middle

Cum se poate controla numărul de fire active într-o aplicație?

sobes.tech AI

Răspuns de la AI

În Go, pentru a controla numărul de fire active (goroutines), se folosesc de obicei mecanisme de sincronizare și limitare a paralelismului:

  • Canale tamponate ca semafoare: creează un canal cu capacitate limitată și, înainte de a porni o goroutine, trimit o valoare în el, iar după finalizare, primește o valoare, limitând astfel numărul de goroutines care rulează simultan.

  • Pachetul sync.WaitGroup: ajută la așteptarea finalizării unui grup de goroutines, dar nu limitează numărul lor.

  • Pachetul golang.org/x/sync/semaphore: oferă un semafor convenabil pentru limitarea paralelismului.

Exemplu cu un canal semafor:

sem := make(chan struct{}, 5) // maximum 5 goroutines simultan

for _, task := range tasks {
    sem <- struct{}{} // blochează dacă deja sunt 5 goroutines în execuție
    go func(t Task) {
        defer func() { <-sem }() // eliberează slotul
        process(t)
    }(task)
}

// Așteaptă până când toate goroutine-urile se termină
for i := 0; i < cap(sem); i++ {
    sem <- struct{}{}
}

Astfel, se poate controla numărul de fire active și se evită consumul excesiv de resurse.