Junior — Middle
Kā noteikt ierobežojumu vienlaicīgi palaistu goroutine skaitam Go valodā?
sobes.tech AI
Atbilde no AI
Go valodā nav iebūvēta mehānisma tieši ierobežot vienlaikus palaidoto gorutīnu skaitu. Tomēr, lai kontrolētu paralēlismu, parasti izmanto semaforus vai ar ierobežotu kapacitāti kanālus.
Piemērs, kā ierobežot vienlaikus darbojošo gorutīnu skaitu, izmantojot kanālu:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // aizņem vietu
fmt.Printf("Goroutine %d sāka darbu\n", id)
time.Sleep(time.Second) // darba imitācija
fmt.Printf("Goroutine %d pabeidza darbu\n", id)
<-sem // atbrīvo vietu
}
func main() {
const maxGoroutines = 3
sem := make(chan struct{}, maxGoroutines) // kanāls ar buferi, ierobežo gorutīnu skaitu
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Šajā piemērā kanāls sem ar buferi maxGoroutines ierobežo vienlaikus darbojošo gorutīnu skaitu. Katra gorutina, pirms sākt darbu, ievieto tukšu struktūru kanālā, aizņemot vietu, un pēc darba pabeigšanas to atbrīvo. Tādējādi vienlaikus var darboties ne vairāk kā maxGoroutines gorutīnu.