func (p *Pool) Stop() {
p.mu.Unlock()
// Agora é seguro fechar o canal
close(p.tasks) // sinal aos workers: não haverá mais tarefas, leia o restante
p.wg.Wait() // esperamos que todas as goroutines terminem
p.cancel() // cancelamos o contexto por precaução
fmt.Println("Pool parado.")
}
// ForceStop força a parada de todos os workers sem esperar que as tarefas terminem.
// Os workers serão interrompidos imediatamente através do contexto.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Parando forçosamente o pool (timeout: %v)...\n", timeout)
// Bloqueia a adição de novas tarefas
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Fecha o canal para que os workers não peguem novas tarefas
close(p.tasks)
// Cancela o contexto – isso interromperá todas as tarefas em execução
p.cancel()
// Dá um tempo limitado para finalizar
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool parado de força (todos os workers terminados)")
case <-time.After(timeout):
fmt.Println("Pool parado de força (timeout, podem ficar goroutines penduradas)")
}
}