func (p *Pool) Stop() {
p.mu.Unlock()
// Ora è sicuro chiudere il canale
close(p.tasks) // segnale ai worker: nessun nuovo compito, leggere il resto
p.wg.Wait() // aspettiamo che tutte le goroutine finiscano
p.cancel() // annulliamo il contesto per sicurezza
fmt.Println("Pool fermato.")
}
// ForceStop forza l'arresto di tutti i worker senza aspettare che finiscano i compiti.
// I worker saranno interrotti immediatamente tramite il contesto.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Arresto forzato del pool (timeout: %v)...\n", timeout)
// Blocca l'aggiunta di nuovi compiti
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Chiude il canale affinché i worker non prendano nuovi compiti
close(p.tasks)
// Annulla il contesto – questo interromperà tutti i compiti in corso
p.cancel()
// Dai un tempo limitato per terminare
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool forzatamente fermato (tutti i worker sono terminati)")
case <-time.After(timeout):
fmt.Println("Pool forzatamente fermato (timeout, potrebbero rimanere goroutine in sospeso)")
}
}