Sobes.tech
Senior

func (p *Pool) Stop() { p.mu.Unlock() // Maintenant, il est sûr de fermer le canal close(p.tasks) // signal aux workers : pas de nouvelles tâches, lire le reste p.wg.Wait() // attendre que toutes les goroutines se terminent p.cancel() // annuler le contexte au cas où fmt.Println("Pool arrêté.") } // ForceStop arrête de force tous les workers sans attendre la fin des tâches. // Les workers seront interrompus immédiatement via le contexte. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Arrêt forcé du pool (timeout : %v)...\n", timeout) // Bloquer l'ajout de nouvelles tâches p.mu.Lock() p.isOpen = false p.mu.Unlock() // Fermer le canal pour que les workers ne prennent pas de nouvelles tâches close(p.tasks) // Annuler le contexte – cela interrompra toutes les tâches en cours p.cancel() // Donner un temps limité pour finir done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Pool arrêté de force (tous les workers terminés)") case <-time.After(timeout): fmt.Println("Pool arrêté de force (timeout, des goroutines peuvent rester en suspens)") } }