Junior — Middle
Kas on võimalik seada piir ühe programmi korraga käivitatavate goroutine'ide arvule?
sobes.tech AI
Vastus AI-lt
Go keeles ei ole sisseehitatud mehhanismi, mis rangelt piiraks samaaegselt käivitunud gorutinite arvu. Võib olla väga palju gorutine, ning nende planeerimine ja vahetus toimub Go jooksutööaja poolt.
Kui aga soovite piirata samaaegselt töötavate gorutinite arvu (näiteks ressursside kasutamise kontrollimiseks), saate kasutada semafore või kanaleid paralleelsuse piiramiseks.
Näide, kuidas piirata samaaegselt töötavate gorutinite arvu kanali abil:
package main
import (
"fmt"
"sync"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // ressursi hankimine
fmt.Printf("Gorutina %d alustas tööd\n", id)
// ... töö ...
fmt.Printf("Gorutina %d lõpetas töö\n", id)
<-sem // ressursi vabastamine
}
func main() {
const maxGoroutines = 5
sem := make(chan struct{}, maxGoroutines)
var wg sync.WaitGroup
for i := 0; i < 20; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Selles näites ei tööta rohkem kui 5 gorutinit samaaegselt.