Junior — Middle
Kako kontrolisati broj aktivnih niti u aplikaciji?
sobes.tech АИ
Одговор од АИ
У Go-у, за контролу броја активних тхреева (goroutine-а), обично се користе механизми за синхронизацију и ограничење паралелизма:
-
Буферизовани канали као семафори: креирају канал са ограниченом капацитетом и пре покретања goroutine-а шаљу вредност у њега, а након што се заврши, примају је, чиме се ограничава број истовремено активних goroutine-а.
-
Пакет
sync.WaitGroup: помаже да се чека на завршетак групе goroutine-а, али не ограничава њихов број. -
Пакет
golang.org/x/sync/semaphore: пружа згодан семафор за ограничење паралелизма.
Пример са коришћењем семафорског канала:
sem := make(chan struct{}, 5) // максимум 5 goroutine-а истовремено
for _, task := range tasks {
sem <- struct{}{} // блокира ако је већ покренуто 5 goroutine-а
go func(t Task) {
defer func() { <-sem }() // ослобађа слот
process(t)
}(task)
}
// Чекамо да се све goroutine-е заврше
for i := 0; i < cap(sem); i++ {
sem <- struct{}{}
}
На овај начин се може контролисати број активних тхреадова и избегавати прекомерна потрошња ресурса.