Junior — Middle
É possível definir um limite no número de threads que podem estar a trabalhar simultaneamente na linguagem Go?
sobes.tech IA
Resposta da IA
No Go, não existe um mecanismo incorporado para limitar diretamente o número de goroutines (threads leves) que estão a funcionar ao mesmo tempo. Pode haver muitas goroutines, e elas são leves. Para limitar o número de goroutines a serem executadas simultaneamente, geralmente usam-se semáforos ou canais com capacidade limitada.
Exemplo de limitação do número de goroutines a funcionar ao mesmo tempo usando um canal:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // Reservar um espaço
fmt.Printf("Trabalhador %d iniciado\n", id)
time.Sleep(time.Second) // Trabalho
fmt.Printf("Trabalhador %d terminado\n", id)
<-sem // Liberar um espaço
}
func main() {
const maxConcurrent = 3
sem := make(chan struct{}, maxConcurrent) // Canal com limite
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Aqui, o canal sem com um buffer de maxConcurrent limita o número de goroutines a funcionar ao mesmo tempo a 3.