Junior — Middle
Da li je moguće postaviti ograničenje na broj gorutina koji se istovremeno pokreću u programu?
sobes.tech АИ
Одговор од АИ
U jeziku Go ne postoji ugrađeni mehanizam za postavljanje čvrstog ograničenja na broj istovremeno pokrenutih gorutina. Može ih biti veoma mnogo, a njihovo planiranje i prebacivanje obavlja runtime Go jezika.
Međutim, ako želite da ograničite broj gorutina koje se istovremeno izvršavaju (na primer, za kontrolu korišćenja resursa), možete koristiti semafore ili kanale za ograničavanje paralelizma.
Primer ograničavanja broja istovremeno rada gorutina pomoću kanala:
package main
import (
"fmt"
"sync"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // sticanje resursa
fmt.Printf("Gorutina %d je počela sa radom\n", id)
// ... rad ...
fmt.Printf("Gorutina %d je završila sa radom\n", id)
<-sem // oslobađanje resursa
}
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()
}
U ovom primeru, neće biti više od 5 gorutina koje rade istovremeno.