Contextos con plazo en Go
Un contexto baja la cancelación por el árbol de llamadas, y cada espera la respeta.
func fetch(ctx context.Context, delay time.Duration) (string, error) {
select {
case <-time.After(delay):
return "fetched", nil
case <-ctx.Done():
return "", ctx.Err()
}
}
func run() (string, error) {
ctx, cancel := context.WithTimeout(context.Background(),
20*time.Millisecond)
defer cancel()
return fetch(ctx, 200*time.Millisecond)
}
Cómo funciona
WithTimeoutse cancela solo cuando el reloj se agota.ctx.Done()es el canal sobre el que hacer select.ctx.Err()dice si fue cancelado o si expiró.
Palabras clave y builtins usados aquí
casedefererrorfuncreturnselectstring
El intento, en números
- Líneas
- 15
- Caracteres a escribir
- 336
- Tokens
- 98
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 56 segundos.
Paso 2 de 3 en Context; paso 12 de 25 en Concurrencia.