Назад к вопросам
Junior — Middle
84
Как определить лимит по количеству одновременно запущенных горутин в языке Go?
Ответ от нейросети
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{}{} // захватываем слот
fmt.Printf("Горутина %d начала работу\n", id)
time.Sleep(time.Second) // имитация работы
fmt.Printf("Горутина %d завершила работу\n", id)
<-sem // освобождаем слот
}
func main() {
const maxGoroutines = 3
sem := make(chan struct{}, maxGoroutines) // канал-буфер ограничивает количество горутин
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
В этом примере канал sem с буфером maxGoroutines ограничивает количество одновременно выполняющихся горутин. Каждая горутина перед началом работы помещает в канал пустую структуру, занимая слот, и освобождает его после завершения. Таким образом, одновременно не более maxGoroutines горутин будут работать.