Limitar la concurrencia en Go
Un canal con búfer, usado como bolsa de tokens, acota cuántos corren a la vez.
func fetchAll(urls []string, limit int) []string {
tokens := make(chan struct{}, limit)
results := make([]string, len(urls))
var wg sync.WaitGroup
for i, url := range urls {
wg.Go(func() {
tokens <- struct{}{} // acquire
defer func() { <-tokens }() // release
results[i] = strings.ToUpper(url)
})
}
wg.Wait()
return results
}
Cómo funciona
- Adquirir es enviar; liberar es recibir.
- El tamaño del búfer es el límite.
- Es el modismo estándar de Go, sin dependencias extra.
Palabras clave y builtins usados aquí
chandeferforfuncintlenmakerangereturnstringstructvar
El intento, en números
- Líneas
- 16
- Caracteres a escribir
- 334
- Tokens
- 101
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 55 segundos.
Paso 2 de 5 en Patrones; paso 20 de 25 en Concurrencia.