Sobes.tech
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 горутини едновременно.