Junior — Middle
Lehet-e korlátot szabni a programban egy időben futó goroutine-ok számára?
sobes.tech MI
Válasz az MI-től
A Go nyelvben nincs beépített mechanizmus a párhuzamosan futó goroutine-ok számának szigorú korlátozására. Nagyon sok goroutine lehet, és azok ütemezését és váltását a Go futásideje kezeli.
Azonban, ha szeretnéd korlátozni a párhuzamosan futó goroutine-ok számát (például az erőforrások felhasználásának ellenőrzése érdekében), használhatsz szeminátorokat vagy csatornákat a párhuzamosság korlátozására.
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"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // erőforrás megszerzése
fmt.Printf("Goroutine %d elkezdte a munkát\n", id)
// ... munka ...
fmt.Printf("Goroutine %d befejezte a munkát\n", id)
<-sem // erőforrás felszabadítása
}
func main() {
const maxGoroutines = 5
sem := make(chan struct{}, maxGoroutines)
var wg sync.WaitGroup
for i := 0; i < 20; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Ebben a példában nem fog több mint 5 goroutine futni egyszerre.