func (p *Pool) Stop() {
p.mu.Unlock()
// Endi mumkin xavfsiz tarzda kanalni yopish
close(p.tasks) // signal ishchilarga: yangi vazifa bo'lmaydi, qolganini o'qing
p.wg.Wait() // barcha goroutine'lar tugashini kutamiz
p.cancel() // ehtiyot chorasi sifatida kontekstni bekor qilamiz
fmt.Println("Pool to'xtatildi.")
}
// ForceStop majburan barcha ishchilarni vazifalar tugashini kutmasdan to'xtatadi.
// Ishchilar darhol kontekst orqali to'xtatiladi.
func (p *Pool) ForceStop(timeout time.Duration) {
fmt.Printf("Majburan to'xtatish (timeout: %v)...\n", timeout)
// Yangi vazifalarni qo'shishni bloklaydi
p.mu.Lock()
p.isOpen = false
p.mu.Unlock()
// Kanalni yopamiz, shunda ishchilar yangi vazifa olmaydi
close(p.tasks)
// Kontekstni bekor qilamiz – bu bajarilayotgan barcha vazifalarni to'xtatadi
p.cancel()
// Yakunlash uchun cheklangan vaqt beramiz
done := make(chan struct{})
go func() {
p.wg.Wait()
close(done)
}()
select {
case <-done:
fmt.Println("Pool majburan to'xtatildi (barcha ishchilar tugadi)")
case <-time.After(timeout):
fmt.Println("Pool majburan to'xtatildi (timeout, qolgan goroutine'lar bo'lishi mumkin)")
}
}