Junior — Middle
Ar įmanoma nustatyti ribą vienu metu veikiančių srautų skaičiui Go kalboje?
sobes.tech AI
Atsakymas iš AI
Go kalboje nėra įmontuoto mechanizmo tiesiogiai apriboti vienu metu veikiančių gorutinių (lengvų siūlų) skaičių. Gali būti labai daug gorutinių, ir jos yra lengvos. Norint apriboti vienu metu veikiančių gorutinių skaičių, dažnai naudojami semaforai arba kanalai su ribotu talpa.
Pavyzdys, kaip apriboti vienu metu veikiančių gorutinių skaičių naudojant kanalą:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // Rezervuoti vietą
fmt.Printf("Darbininkas %d pradėjo\n", id)
time.Sleep(time.Second) // Darbas
fmt.Printf("Darbininkas %d baigė\n", id)
<-sem // Atlaisvinti vietą
}
func main() {
const maxConcurrent = 3
sem := make(chan struct{}, maxConcurrent) // Kanalas su apribojimu
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Čia kanalas sem su buferiu maxConcurrent apriboja vienu metu veikiančių gorutinių skaičių iki 3.