Как може да се контролира броят на активните потоци в приложение?
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{}{}
}
По този начин може да се контролира броят на активните потоци и да се избегне прекомерното използване на ресурси.