Junior — Middle
Je možné nastaviť limit na počet súčasne bežiacich vlákien v jazyku Go?
sobes.tech AI
Odpoveď od AI
V jazyku Go neexistuje zabudovaný mechanizmus na priame obmedzenie počtu gorutín (ľahkých vlákien), ktoré bežia súčasne. Môže ich byť veľmi veľa a sú ľahké. Na obmedzenie počtu gorutín, ktoré bežia súčasne, sa zvyčajne používajú semafory alebo kanály s obmedzenou kapacitou.
Príklad obmedzenia počtu gorutín, ktoré bežia súčasne pomocou kanála:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // Rezervovať miesto
fmt.Printf("Pracovník %d začal\n", id)
time.Sleep(time.Second) // Práca
fmt.Printf("Pracovník %d skončil\n", id)
<-sem // Uvoľniť miesto
}
func main() {
const maxConcurrent = 3
sem := make(chan struct{}, maxConcurrent) // Kanál s limitom
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Tu kanál sem s vyrovnávacou pamäťou maxConcurrent obmedzuje počet gorutín, ktoré bežia súčasne, na 3.