Sobes.tech
Junior — Middle

Ako určiť limit počtu súčasne spustených gorútin v jazyku Go?

sobes.tech AI

Odpoveď od AI

V jazyku Go neexistuje zabudovaný mechanizmus na priame obmedzenie počtu gorutín, ktoré sa spúšťajú súčasne. Avšak, na kontrolu limitu paralelizmu sa zvyčajne používajú semafory alebo kanály s obmedzenou kapacitou.

Príklad obmedzenia počtu súčasne bežiacich gorutín pomocou kanála:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // obsadiť miesto
    fmt.Printf("Gorutina %d začala pracovať\n", id)
    time.Sleep(time.Second) // simulácia práce
    fmt.Printf("Gorutina %d ukončila prácu\n", id)
    <-sem // uvoľniť miesto
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // kanál s bufferom obmedzuje počet gorutín
    var wg sync.WaitGroup

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

V tomto príklade obmedzuje kanál sem s bufferom maxGoroutines počet súčasne bežiacich gorutín. Každá gorutina, pred začatím práce, vloží do kanála prázdnu štruktúru, čím obsadí miesto, a po dokončení ho uvoľní. Týmto spôsobom nebude súčasne pracovať viac ako maxGoroutines gorutín.