Junior — Middle
Jak określić limit liczby jednocześnie uruchomionych goroutines w języku Go?
sobes.tech AI
Odpowiedź od AI
W języku Go nie ma wbudowanego mechanizmu bezpośredniego ograniczania liczby uruchomionych gorutyn jednocześnie. Jednakże, aby kontrolować limit paralelizmu, zazwyczaj używa się semaforów lub kanałów o ograniczonej pojemności.
Przykład ograniczenia liczby jednocześnie działających gorutyn za pomocą kanału:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // rezerwujemy miejsce
fmt.Printf("Gorutyna %d rozpoczęła pracę\n", id)
time.Sleep(time.Second) // symulacja pracy
fmt.Printf("Gorutyna %d zakończyła pracę\n", id)
<-sem // zwalniamy miejsce
}
func main() {
const maxGoroutines = 3
sem := make(chan struct{}, maxGoroutines) // kanał z buforem ogranicza liczbę gorutyn
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
W tym przykładzie kanał sem z buforem maxGoroutines ogranicza liczbę jednocześnie działających gorutyn. Każda gorutyna przed rozpoczęciem pracy umieszcza pustą strukturę w kanale, zajmując miejsce, i zwalnia je po zakończeniu. W ten sposób nie więcej niż maxGoroutines gorutyn będzie działać jednocześnie.