Junior — Middle
Hogyan lehet ellenőrizni az alkalmazásban az aktív szálak számát?
sobes.tech MI
Válasz az MI-től
Go nyelvben az aktív szálak (goroutine-ok) számának ellenőrzésére általában szinkronizációs és párhuzamosság-korlátozó mechanizmusokat használnak:
-
Bufferelt csatornák mint szemaforok: létrehoznak egy korlátozott kapacitású csatornát, és a goroutine indítása előtt értéket küldenek bele, majd a befejezés után fogadnak egy értéket, így korlátozva a párhuzamosan futó goroutine-ok számát.
-
sync.WaitGroupcsomag: segít várni, hogy egy goroutine-csoport befejeződjön, de nem korlátozza azok számát. -
golang.org/x/sync/semaphorecsomag: kényelmes szemafort biztosít a párhuzamosság korlátozására.
Példa egy csatorna-szemafor használatára:
sem := make(chan struct{}, 5) // legfeljebb 5 goroutine egyszerre
for _, task := range tasks {
sem <- struct{}{} // blokkol, ha már 5 goroutine fut
go func(t Task) {
defer func() { <-sem }() // hely felszabadítása
process(t)
}(task)
}
// Várunk, amíg minden goroutine be nem fejeződik
for i := 0; i < cap(sem); i++ {
sem <- struct{}{}
}
Így kontrollálható az aktív szálak száma, és elkerülhető a túlzott erőforrás-felhasználás.