Sobes.tech
Junior — Middle
100

Можно ли установить предел на число одновременно запущенных горутин в программе?

Сұралған компаниялар
Betera Group

AI-дан жауап

sobes.tech AI

В языке Go нет встроенного механизма для установки жёсткого предела на количество одновременно запущенных горутин. Горутин может быть очень много, и их планирование и переключение осуществляет рантайм Go.

Однако, если нужно ограничить число одновременно выполняющихся горутин (например, для контроля использования ресурсов), можно использовать семафоры или каналы для ограничения параллелизма.

Пример ограничения числа одновременно работающих горутин с помощью канала:

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 горутин.