func (p *Pool) Stop() {
p.mu.Unlock()
// Acum este sigur să închidem canalul
close(p.tasks) // semnal către lucrători: nu vor mai fi sarcini noi, citiți restul
p.wg.Wait() // așteptăm finalizarea tuturor goroutine-urilor
p.cancel() // anulăm contextul, dacă e cazul
fmt.Println("Pool oprit.")
}
// ForceStop oprește forțat toți lucrătorii fără a aștepta finalizarea sarcinilor.
// Lucrătorii vor fi întrerupți imediat prin intermediul contextului.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Oprire forțată a pool-ului (timeout: %v)...\n", timeout)
// Blochează adăugarea de sarcini noi
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Închide canalul pentru ca lucrătorii să nu mai ia sarcini noi
close(p.tasks)
// Anulează contextul – acest lucru va întrerupe toate sarcinile în curs
p.cancel()
// Oferă un timp limitat pentru finalizare
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool oprit forțat (toți lucrătorii au fost terminați)")
case <-time.After(timeout):
fmt.Println("Pool oprit forțat (timeout, pot rămâne goroutine suspendate)")
}
}