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.