func (p *Pool) Stop() {
p.mu.Unlock()
// Teraz je bezpečné zatvoriť kanál
close(p.tasks) // signál pracovníkom: žiadne nové úlohy, prečítajte zvyšok
p.wg.Wait() // čakáme na dokončenie všetkých goroutine
p.cancel() // zrušíme kontext, ak je to potrebné
fmt.Println("Pool zastavený.")
}
// ForceStop nútene zastavuje všetkých pracovníkov bez čakania na dokončenie úloh.
// Pracovníci budú okamžite prerušené cez kontext.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Nútené zastavenie poolu (timeout: %v)...\n", timeout)
// Blokuje pridávanie nových úloh
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Zatvára kanál, aby pracovníci nebrali nové úlohy
close(p.tasks)
// Zrušíme kontext – to preruší všetky prebiehajúce úlohy
p.cancel()
// Dáme obmedzený čas na dokončenie
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool nútene zastavený (všetci pracovníci ukončení)")
case <-time.After(timeout):
fmt.Println("Pool nútene zastavený (timeout, môžu zostať visí goroutine)")
}
}