func (p *Pool) Stop() {
p.mu.Unlock()
// Ahora se puede cerrar el canal de forma segura
close(p.tasks) // señal a los workers: no habrá más tareas, lee el resto
p.wg.Wait() // esperamos a que terminen todos los goroutines
p.cancel() // cancelamos el contexto por si acaso
fmt.Println("Pool detenido.")
}
// ForceStop detiene forzosamente todos los workers sin esperar a que terminen las tareas.
// Los workers serán interrumpidos inmediatamente a través del contexto.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Deteniendo forzosamente el pool (timeout: %v)...\n", timeout)
// Bloqueamos la adición de nuevas tareas
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Cerramos el canal para que los workers no tomen nuevas tareas
close(p.tasks)
// Cancelamos el contexto – esto interrumpirá todas las tareas en ejecución
p.cancel()
// Damos un tiempo limitado para finalizar
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool detenido forzosamente (todos los workers han terminado)")
case <-time.After(timeout):
fmt.Println("Pool detenido forzosamente (timeout, pueden quedar goroutines colgadas)")
}
}