func (p *Pool) Stop() {
p.mu.Unlock()
// Сада је безбедно затворити канал
close(p.tasks) // сигнал радницима: нема нових задатака, прочитај остатак
p.wg.Wait() // чекамо да се све горутинес заврше
p.cancel() // отказујемо контекст ако је потребно
fmt.Println("Pool заустављен.")
}
// ForceStop принудно зауставља све раднике без чекања да заврше задатке.
// Радници ће бити прекинути одмах преко контекста.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Принудно заустављање пула (timeout: %v)...\n", timeout)
// Блокира додавање нових задатака
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Затвара канал да радници не узимају нове задатке
close(p.tasks)
// Отказујемо контекст – ово ће прекинути све тренутне задатке
p.cancel()
// Дамо ограничено време за завршетак
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Пул принудно заустављен (сви радници су завршени)")
case <-time.After(timeout):
fmt.Println("Пул принудно заустављен (таймаут, могу остати виси goroutine-и)")
}
}