func (p *Pool) Stop() {
p.mu.Unlock()
// Dabar saugu yra uždaryti kanalą
close(p.tasks) // signalas darbuotojams: naujų užduočių nebus, skaitykite likusį
p.wg.Wait() // laukiame, kol visi gorutinai baigsis
p.cancel() // atšaukia kontekstą, jei reikia
fmt.Println("Pool sustabdytas.")
}
// ForceStop priverstinai sustabdo visus darbuotojus be laukimo, kol užduotys bus baigtos.
// Darbuotojai bus nedelsiant nutraukti per kontekstą.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Priverstinis pulo sustabdymas (laiko limitas: %v)...\n", timeout)
// Blokuoja naujų užduočių pridėjimą
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Uždaro kanalą, kad darbuotojai neimtų naujų užduočių
close(p.tasks)
// Atšaukia kontekstą – tai nutrauks visas vykdomas užduotis
p.cancel()
// Suteikia ribotą laiką užbaigimui
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool priverstinai sustabdytas (visi darbuotojai baigė)")
case <-time.After(timeout):
fmt.Println("Pool priverstinai sustabdytas (laiko limitas, gali likti pakabintų goroutine)")
}
}