func (p *Pool) Stop() {
p.mu.Unlock()
// Nyní je bezpečné uzavřít kanál
close(p.tasks) // signál pracovníkům: žádné nové úkoly, přečtěte zbytek
p.wg.Wait() // čekáme na dokončení všech gorutin
p.cancel() // v případě potřeby zrušíme kontext
fmt.Println("Pool zastaven.")
}
// ForceStop násilně zastavuje všechny pracovníky bez čekání na dokončení úkolů.
// Pracovníci budou okamžitě přerušeni přes kontext.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Násilné zastavení poolu (timeout: %v)...\n", timeout)
// Blokuje přidávání nových úkolů
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Uzavře kanál, aby pracovníci nebrali nové úkoly
close(p.tasks)
// Zruší kontext – to přeruší všechny probíhající úkoly
p.cancel()
// Dává omezený čas na dokončení
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool násilně zastaven (všichni pracovníci ukončeni)")
case <-time.After(timeout):
fmt.Println("Pool násilně zastaven (timeout, mohou zůstat visící goroutines)")
}
}