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
time.Afterdevuelve un canal que dispara una sola vez.- La rama perdedora simplemente no se toma.
- Para plazos repetidos, un Timer que puedas parar con Stop fuga menos.
Palabras clave y builtins usados aquí
casechandefererrorforfuncintreturnselectstring
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.
Paso 3 de 3 en select; paso 10 de 25 en Concurrencia.