Sobes.tech
Junior — Middle

Comment peut-on arrêter de force plusieurs goroutines en cours d'exécution en Go?

sobes.tech IA

Réponse de l'IA

En Go, pour arrêter plusieurs goroutines en cours d'exécution de manière forcée, on utilise généralement le mécanisme d'annulation via le contexte (context.Context).

L'idée principale :

  • Créer un contexte avec annulation (context.WithCancel ou context.WithTimeout).
  • Chaque goroutine reçoit ce contexte et vérifie périodiquement s'il a été annulé.
  • Lorsqu'on appelle la fonction d'annulation (cancel()), toutes les goroutines reçoivent le signal et peuvent se terminer proprement.

Exemple :

ctx, cancel := context.WithCancel(context.Background())

for i := 0; i < 5; i++ {
    go func(id int) {
        for {
            select {
            case <-ctx.Done():
                fmt.Printf("Goroutine %d arrêtée\n", id)
                return
            default:
                // travail de la goroutine
                time.Sleep(100 * time.Millisecond)
            }
        }
    }(i)
}

// Après un certain temps, arrêter toutes les goroutines
time.Sleep(1 * time.Second)
cancel()

// Attendre leur terminaison (par exemple, avec sync.WaitGroup)

Cette approche permet de gérer centralement l'arrêt de plusieurs goroutines et d'éviter les problèmes de terminaison non contrôlée.