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.