Junior — Middle
Може ли да се постави лимит на броя на едновременно изпълняваните горутини в програма?
sobes.tech AI
Отговор от AI
В езика Go няма вградена механизъм за поставяне на твърд лимит върху броя на едновременно стартираните горутини. Може да има много горутини, а тяхното планиране и превключване се управлява от Go runtime.
Ако обаче трябва да ограничите броя на горутините, които се изпълняват едновременно (например, за контрол на използването на ресурси), можете да използвате семафори или канали за ограничаване на паралелизма.
Пример за ограничаване на броя на едновременно работещите горутини с помощта на канал:
package main
import (
"fmt"
"sync"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // придобиване на ресурс
fmt.Printf("Горутина %d започна работа\n", id)
// ... работа ...
fmt.Printf("Горутина %d приключи работа\n", id)
<-sem // освобождаване на ресурса
}
func main() {
const maxGoroutines = 5
sem := make(chan struct{}, maxGoroutines)
var wg sync.WaitGroup
for i := 0; i < 20; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
В този пример няма да работят повече от 5 горутини едновременно.