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-дер калат)")
}
}