Sobes.tech
Senior

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