Sobes.tech
Senior

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)") } }