Sobes.tech
Junior — Middle

Je možné nastavit limit na počet současně běžících vláken v jazyce Go?

sobes.tech AI

Odpověď od AI

V jazyce Go neexistuje vestavěný mechanismus pro přímé omezení počtu současně běžících gorutin (lehkých vláken). Může jich být velmi mnoho a jsou lehké. Pro omezení počtu gorutin, které běží současně, se obvykle používají semafory nebo kanály s omezenou kapacitou.

Příklad omezení počtu současně běžících gorutin pomocí kanálu:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // Rezervace místa
    fmt.Printf("Dělník %d začal\n", id)
    time.Sleep(time.Second) // Práce
    fmt.Printf("Dělník %d skončil\n", id)
    <-sem // Uvolnění místa
}

func main() {
    const maxConcurrent = 3
    sem := make(chan struct{}, maxConcurrent) // Kanál s limitem
    var wg sync.WaitGroup

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

    wg.Wait()
}

Zde kanál sem s bufferem maxConcurrent omezuje počet současně běžících gorutin na 3.