Junior — Middle
Как да определим лимита за броя на едновременно стартираните горутини в езика Go?
sobes.tech AI
Отговор от 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 горутини ще работят едновременно.