Senior
Van egy szolgáltatásod, ami sok goroutine-t indít. Hogyan korlátoznád a párhuzamosan futó goroutine-ok számát?
sobes.tech MI
Válasz az MI-től
A Go-ban a párhuzamosan futó goroutine-ok számának korlátozására gyakran használnak szeminátorokat vagy pufferelt csatornákat. Az ötlet az, hogy létrehozunk egy csatornát, amelynek kapacitása megegyezik a maximálisan párhuzamos goroutine-ok számával, és mielőtt elindítunk egy goroutine-t, értéket küldünk erre a csatornára, majd a befejezés után kivesszük, így szabad helyet hagyva a következőnek.
Példa:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // hely foglalása
defer func() { <-sem }() // hely felszabadítása munka után
fmt.Printf("Munkás %d indult\n", id)
time.Sleep(1 * time.Second) // munka szimuláció
fmt.Printf("Munkás %d befejeződött\n", id)
}
func main() {
const maxConcurrent = 3
sem := make(chan struct{}, maxConcurrent)
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Ebben a példában nem fog egyszerre több, mint 3 goroutine futni.