Sobes.tech
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{}{}
}

На овај начин се може контролисати број активних тхреадова и избегавати прекомерна потрошња ресурса.