Sobes.tech
Senior

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