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.WithCanceloucontext.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.