Junior — Middle
Kuidas määrata Go keeles samaaegselt käivitatavate goroutine'ide arvu limiit?
sobes.tech AI
Vastus AI-lt
Go keeles ei ole sisseehitatud mehhanismi otse samaaegselt käivitatavate gorutinite arvu piiramiseks. Kuid paralleelsuse limiidi kontrollimiseks kasutatakse tavaliselt semafore või piiratud mahutavusega kanaleid.
Näide samaaegselt töötavate gorutinite arvu piiramisest kanali abil:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // broneeri koht
fmt.Printf("Goroutine %d alustas tööd\n", id)
time.Sleep(time.Second) // töö simulatsioon
fmt.Printf("Goroutine %d lõpetas tööd\n", id)
<-sem // vabasta koht
}
func main() {
const maxGoroutines = 3
sem := make(chan struct{}, maxGoroutines) // kanal piirab gorutinite arvu
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Selles näites piirab sem kanal, mille mahutavus on maxGoroutines, samaaegselt töötavate gorutinite arvu. Iga gorutina, enne töö alustamist, paneb kanali tühja struktuuri, mis hõivab koha, ja vabastab selle pärast töö lõpetamist. Nii töötab samaaegselt mitte rohkem kui maxGoroutines gorutinit.