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("Принудително спиране на пула (таймаут: %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)")
}
}