Junior — Middle
Ar įmanoma nustatyti ribą vienu metu vykdomų goroutine'ų skaičiui programoje?
sobes.tech AI
Atsakymas iš AI
Go kalboje nėra įmontuoto mechanizmo, kuris nustatytų griežtą ribą vienu metu paleistų gorutinių skaičiui. Gali būti labai daug gorutinių, o jų planavimą ir perjungimą vykdo Go vykdymo laikas.
Tačiau, jei norite apriboti vienu metu vykdomų gorutinių skaičių (pavyzdžiui, resursų naudojimo kontrolės tikslais), galite naudoti semaforus arba kanalus, kad apribotumėte paralelizmą.
Pavyzdys, kaip apriboti vienu metu veikiančių gorutinių skaičių naudojant kanalą:
package main
import (
"fmt"
"sync"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // išankstinis resurso įsigijimas
fmt.Printf("Gorutina %d pradėjo darbą\n", id)
// ... darbas ...
fmt.Printf("Gorutina %d baigė darbą\n", id)
<-sem // resurso atlaisvinimas
}
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()
}
Šiuo pavyzdžiu, vienu metu dirbs ne daugiau kaip 5 gorutinos.