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)")
}
}