typestar

Timeouts en Go

Un select contra time.After acota cuánto esperas.

func withTimeout(work <-chan string, limit time.Duration) (string, error) {
    select {
    case result := <-work:
        return result, nil
    case <-time.After(limit):
        return "", fmt.Errorf("timed out after %s", limit)
    }
}

func tick(limit time.Duration) int {
    ticker := time.NewTicker(limit / 4)
    defer ticker.Stop()

    count := 0
    deadline := time.After(limit)
    for {
        select {
        case <-ticker.C:
            count++
        case <-deadline:
            return count
        }
    }
}

Cómo funciona

  1. time.After devuelve un canal que dispara una sola vez.
  2. La rama perdedora simplemente no se toma.
  3. Para plazos repetidos, un Timer que puedas parar con Stop fuga menos.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
24
Caracteres a escribir
419
Tokens
111
Ritmo de tres estrellas
100 tpm

Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 67 segundos.

Escribe este fragmento

Paso 3 de 3 en select; paso 10 de 25 en Concurrencia.

← Anterior Siguiente →

Timeouts en otros lenguajes