func (p *Pool) Stop() {
p.mu.Unlock()
// Այժմ անվտանգ է փակել ալիքը
close(p.tasks) // ազդանշան աշխատողներին՝ նոր առաջադրանքներ չեն լինի, կարդացեք մնացորդը
p.wg.Wait() // սպասում ենք բոլոր գորուտինների ավարտին
p.cancel() // անհրաժեշտության դեպքում չեղյալ հայտարարում ենք կոնտեքստը
fmt.Println("Pool կանգնեց.")
}
// ForceStop ուժեղորեն կանգնեցնում է բոլոր աշխատողներին՝ սպասելու Tasks-ի ավարտին չպահանջելով:
// Աշխատողները անմիջապես կկտրվեն կոնտեքստի միջոցով:
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("Պուլը ուժեղորեն կանգնեցվեց (timeout, կարող են մնալ կախված goroutine-ներ)")
}
}