Junior — Middle
Como determinar o limite do número de goroutines executadas simultaneamente na linguagem Go?
sobes.tech IA
Resposta da IA
Na linguagem Go, não existe um mecanismo incorporado para limitar diretamente o número de goroutines que são executadas simultaneamente. No entanto, para controlar o limite de paralelismo, geralmente usam-se semáforos ou canais com capacidade limitada.
Exemplo de limitação do número de goroutines em execução simultânea usando um canal:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // adquirir uma vaga
fmt.Printf("Goroutine %d começou a trabalhar\n", id)
time.Sleep(time.Second) // simulação de trabalho
fmt.Printf("Goroutine %d terminou de trabalhar\n", id)
<-sem // liberar uma vaga
}
func main() {
const maxGoroutines = 3
sem := make(chan struct{}, maxGoroutines) // canal com buffer limita o número de goroutines
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Neste exemplo, o canal sem com buffer de maxGoroutines limita o número de goroutines que podem estar em execução ao mesmo tempo. Cada goroutine, antes de começar a trabalhar, coloca uma estrutura vazia no canal, ocupando uma vaga, e a libera após terminar. Assim, no máximo maxGoroutines goroutines estarão trabalhando simultaneamente.