0Pricing
Go Academy · Leçon

WithCancel et WithTimeout

Créer des contextes annulables et limités dans le temps

WithCancel et WithTimeout est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

context.WithCancel

WithCancel dérive un nouveau Context accompagné d’une fonction d’annulation. L’appel à cancel ferme le canal Done du Context dérivé et de tous ses enfants.

ctx, cancel := context.WithCancel(parent)
defer cancel() // always call to release resources
go doWork(ctx)

Utilisez toujours defer cancel

Ne pas appeler cancel laisse s’exécuter la goroutine qui surveille le Context parent, ce qui provoque une fuite. Utilisez toujours defer cancel immédiatement après avoir créé un Context annulable.

context.WithTimeout

WithTimeout dérive un Context qui s’annule automatiquement après la durée indiquée. Il s’agit d’un raccourci pratique autour de WithDeadline.

ctx, cancel := context.WithTimeout(parent, 5*time.Second)
defer cancel()
if err := db.QueryContext(ctx, query); err != nil {
    // err may be context.DeadlineExceeded
}

Vérifier Err()

Une fois Done fermé, ctx.Err() renvoie la raison : context.Canceled (annulation explicite) ou context.DeadlineExceeded (délai d’expiration).

if err := ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
    log.Println("timeout")
}

Annuler depuis une autre goroutine

La fonction d’annulation peut être appelée en toute sécurité depuis n’importe quelle goroutine et simultanément depuis plusieurs goroutines. Seul le premier appel a un effet.

ctx, cancel := context.WithCancel(context.Background())
go func() {
    if detectError() { cancel() }
}()

Délai d’expiration de la requête HTTP

Définissez un délai d’expiration par requête avec WithTimeout sur le Context de la requête entrante :

func handler(w http.ResponseWriter, r *http.Request) {
    ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
    defer cancel()
    result, err := service.Call(ctx)
    // ...
}

Annulation en cascade

Si un Context parent est annulé, tous les Context dérivés (enfants et petits-enfants) sont automatiquement annulés, ce qui arrête toutes les goroutines de l’arbre d’appels.

Context dans les tests

Utilisez context.Background() ou context.WithTimeout dans les tests afin de limiter dans le temps les goroutines démarrées par les tests.

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
testResult := runTest(ctx)

Propager Context dans les bibliothèques

Transmettez toujours le Context reçu aux appels sortants (requêtes vers la base de données, appels HTTP, appels RPC). Ne le supprimez ni ne le remplacez jamais, sauf raison précise de réinitialiser l’échéance.

Créer un Context pour une tâche en arrière-plan

Pour les tâches en arrière-plan qui ne sont pas liées à une requête, utilisez context.Background() comme racine et ajoutez un WithCancel afin de pouvoir arrêter la tâche correctement.

select avec Done

Utilisez toujours select sur ctx.Done() en parallèle du canal de travail afin d’éviter un blocage lorsque le Context est annulé avant la fin du travail.

select {
case result := <-workCh:
    return result, nil
case <-ctx.Done():
    return nil, ctx.Err()
}

Vérification rapide

Quelle est la différence entre context.WithCancel et context.WithTimeout ?

Récapitulatif&nbsp;: WithCancel et WithTimeout

Points essentiels :

  • Utilisez toujours defer cancel() juste après la création
  • WithTimeout annule automatiquement après la durée indiquée ; renvoie DeadlineExceeded
  • ctx.Err() permet de distinguer Canceled de DeadlineExceeded
  • L’annulation se propage à tous les Context dérivés

Questions Fréquemment Posées

La leçon « WithCancel et WithTimeout » est-elle gratuite ?

Oui — le texte complet de « WithCancel et WithTimeout » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « WithCancel et WithTimeout » ?

Créer des contextes annulables et limités dans le temps Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « WithCancel et WithTimeout » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Pourquoi context.Context existe
  2. WithCancel et WithTimeout
  3. WithDeadline et WithValue
  4. Context dans les appels HTTP et de base de données
← Retour à Go Academy