Sobes.tech
Junior — Middle

Как може да се контролира броят на активните потоци в приложение?

sobes.tech AI

Отговор от AI

В Go обикновено за контрол на броя на активните потоци (goroutines) се използват механизми за синхронизация и ограничаване на паралелизма:

  • Буферирани канали като семафори: създават канал с ограничена капацитет и преди стартиране на 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{}{}
}

По този начин може да се контролира броят на активните потоци и да се избегне прекомерното използване на ресурси.