Junior — Middle
Da li je moguće postaviti limit na broj istovremeno radaćih niti u jeziku Go?
sobes.tech АИ
Одговор од АИ
U jeziku Go ne postoji ugrađeni mehanizam za direktno ograničavanje broja gorutina (lakih niti) koje rade istovremeno. Može ih biti mnogo, i one su lagane. Da biste ograničili broj gorutina koje se istovremeno izvršavaju, obično se koriste semafori ili kanali sa ograničenom kapacitetom.
Primer ograničavanja broja gorutina koje rade istovremeno pomoću kanala:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // Rezervisati mesto
fmt.Printf("Radnik %d je počeo\n", id)
time.Sleep(time.Second) // Rad
fmt.Printf("Radnik %d je završio\n", id)
<-sem // Oslobađanje mesta
}
func main() {
const maxConcurrent = 3
sem := make(chan struct{}, maxConcurrent) // Kanal sa ograničenjem
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Ovde kanal sem sa baferom maxConcurrent ograničava broj gorutina koje rade istovremeno na 3.