typestar

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

  1. WithTimeout se cancela solo cuando el reloj se agota.
  2. ctx.Done() es el canal sobre el que hacer select.
  3. ctx.Err() dice si fue cancelado o si expiró.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 3 en Context; paso 12 de 25 en Concurrencia.

← Anterior Siguiente →