Back to questions
Andersen
Senior
3
You have a service that spawns many goroutines. How would you limit the number of concurrently running goroutines?
Companies where asked
Answer from AI
sobes.tech AI
Для ограничения количества одновременно работающих горутин в Go часто используют семафоры или буферизованные каналы. Идея в том, чтобы создать канал с емкостью, равной максимальному числу параллельных горутин, и перед запуском горутины отправлять в этот канал значение, а после завершения — извлекать его, освобождая место для следующей.
Пример:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // захватываем слот
defer func() { <-sem }() // освобождаем слот после работы
fmt.Printf("Worker %d started\n", id)
time.Sleep(1 * time.Second) // имитация работы
fmt.Printf("Worker %d finished\n", id)
}
func main() {
const maxConcurrent = 3
sem := make(chan struct{}, maxConcurrent)
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
В этом примере одновременно будут работать не более 3 горутин.