Junior — Middle
Hogyan határozható meg a Go nyelvben az egyidejűleg futó goroutine-ok száma?
sobes.tech MI
Válasz az MI-től
A Go nyelvben nincs beépített mechanizmus a futó gorutinák számának közvetlen korlátozására. Azonban a párhuzamosság korlátjának ellenőrzésére általában szeminátorokat vagy korlátozott kapacitású csatornákat használnak.
Példa a futó gorutinák 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("Goroutine %d elkezdte a munkát\n", id)
time.Sleep(time.Second) // munka szimulálása
fmt.Printf("Goroutine %d befejezte a munkát\n", id)
<-sem // hely felszabadítása
}
func main() {
const maxGoroutines = 3
sem := make(chan struct{}, maxGoroutines) // csatorna pufferrel, korlátozza a gorutinák számát
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 a sem nevű csatorna, amelynek pufferkapacitása maxGoroutines, korlátozza az egyszerre futó gorutinák számát. Minden gorutin, mielőtt elkezdené a munkát, egy üres struktúrát helyez el a csatornába, elfoglalva egy helyet, és a munka befejezése után felszabadítja azt. Így legfeljebb maxGoroutines gorutin fut egyszerre.