Sobes.tech
Senior

Sie haben einen Dienst, der viele Goroutines spawn. Wie würden Sie die Anzahl der gleichzeitig laufenden Goroutines begrenzen?

sobes.tech KI

Antwort von AI

Для ограничения количества одновременно работающих горутин в Go часто используют семафоры или буферизованные каналы. Идея в том, чтобы создать канал с емкостью, равной максимальному числу параллельных горутин, и перед запуском горутины отправлять в этот канал значение, а после завершения — извлекать его, освобождая место для следующей.

Пример:

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{}          // захватываем слот
    defer func() { <-sem }()   // освобождаем слот после работы

    fmt.Printf("Worker %d started\n", id)
    time.Sleep(1 * time.Second) // имитация работы
    fmt.Printf("Worker %d finished\n", id)
}

func main() {
    const maxConcurrent = 3
    sem := make(chan struct{}, maxConcurrent)
    var wg sync.WaitGroup

    for i := 1; i <= 10; i++ {
        wg.Add(1)
        go worker(i, sem, &wg)
    }

    wg.Wait()
}

В этом примере одновременно будут работать не более 3 горутин.