Sobes.tech
Назад к вопросам
Junior — Middle
86

Каким образом можно контролировать число активных потоков в приложении?

Компании, где спрашивали
КасперскийКасперский

Ответ от нейросети

sobes.tech AI

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

  • Буферизированные каналы как семафоры: создают канал с ограниченной емкостью и перед запуском горутины отправляют туда значение, а после завершения — принимают, тем самым ограничивая число одновременно работающих горутин.

  • Пакет sync.WaitGroup: помогает ждать завершения группы горутин, но не ограничивает их число.

  • Пакет golang.org/x/sync/semaphore: предоставляет удобный семафор для ограничения параллелизма.

Пример с использованием канала-семафора:

sem := make(chan struct{}, 5) // максимум 5 горутин одновременно

for _, task := range tasks {
    sem <- struct{}{} // блокирует, если 5 горутин уже запущено
    go func(t Task) {
        defer func() { <-sem }() // освобождаем слот
        process(t)
    }(task)
}

// Ждем пока все горутины завершатся
for i := 0; i < cap(sem); i++ {
    sem <- struct{}{}
}

Таким образом можно контролировать число активных потоков и избегать чрезмерного потребления ресурсов.