Junior — Middle
Lehetséges korlátot szabni a Go nyelvben egyszerre működő szálak számára?
sobes.tech MI
Válasz az MI-től
A Go nyelvben nincs beépített mechanizmus a párhuzamosan működő goroutine-ok (könnyű szálak) számának közvetlen korlátozására. Sok goroutine lehet, és azok könnyűek. A párhuzamosan futó goroutine-ok számának korlátozására általában szeminátorokat vagy korlátozott kapacitású csatornákat használnak.
Példa a párhuzamosan futó goroutine-ok számának korlátozására csatorna segítségével:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // Hely foglalása
fmt.Printf("Munkás %d indult\n", id)
time.Sleep(time.Second) // Munka
fmt.Printf("Munkás %d befejeződött\n", id)
<-sem // Hely felszabadítása
}
func main() {
const maxConcurrent = 3
sem := make(chan struct{}, maxConcurrent) // Korlátozott csatorna
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Itt a sem csatorna, amelynek puffermérete maxConcurrent, korlátozza a párhuzamosan futó goroutine-ok számát 3-ra.