Junior — Middle
Kas on võimalik määrata piir ühe korraga töötavate lõimede arvule Go keeles?
sobes.tech AI
Vastus AI-lt
Go keeles ei ole sisseehitatud mehhanismi otse piirata samaaegselt töötavate gorutinate (kergete lõimede) arvu. Võib olla väga palju gorutine ja need on kergekaalulised. Samaaegselt töötavate gorutinate arvu piiramiseks kasutatakse tavaliselt semafore või piiratud mahutavusega kanaleid.
Näide, kuidas piirata samaaegselt töötavate gorutinate arvu 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("Tööline %d alustas\n", id)
time.Sleep(time.Second) // Töö
fmt.Printf("Tööline %d lõpetas\n", id)
<-sem // Vabasta koht
}
func main() {
const maxConcurrent = 3
sem := make(chan struct{}, maxConcurrent) // Kanal piiranguga
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Siin kanal sem koos mahuga maxConcurrent piirab samaaegselt töötavate gorutinate arvu 3-ks.