typestar

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

  1. Adquirir es enviar; liberar es recibir.
  2. El tamaño del búfer es el límite.
  3. Es el modismo estándar de Go, sin dependencias extra.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 5 en Patrones; paso 20 de 25 en Concurrencia.

← Anterior Siguiente →